ARM 架构中的 ASID(地址空间标识符)在一个寄存器中占用 8 位。这意味着可以分配 256 个 ASID。但是在linux内核中,甚至有超过1024个任务可以同时运行。 Linux内核如何处理ASID用完的情况?
我查过内核源码,当ASID用完时,内核会重新分配ASID给新任务。考虑到一种情况,最新的任务拥有第一个 ASID(0b1000 0000 0000 0001),但有一个任务必须已经拥有相同的 ASID。如果这两个任务需要进行cantext切换怎么办?我还没有找到相关的内核源代码。
linux 内核中的相关代码在 ~/kernel/core.c context_switch() 中。任何回复将不胜感激,提前致谢
此致。
苍鹭
最佳答案
我找到了一些关于此的说明,如下所示(Cortex -A9 程序员指南 P8-20):
ASID 是动态分配的,不能保证在生命周期内保持不变
过程。由于 ASID 寄存器只提供八位 ASID 空间,我们可以有更多
与 256 个进程相比,Linux 有一个分配 ASID 的方案。对于一个新的进程,我们增加
最后使用的 ASID 值。当达到最后一个值时,我们必须采取一些行动。 TLB
刷新(跨 SMP 系统中的所有处理器)。上下文中前 24 位的值
ID 寄存器可被视为“世代”编号,它会递增。步入一个
新一代意味着上一代的所有 ASID 值现在都无效并且
ASID 编号重新开始。在上下文切换时,使用老一代的进程
版本的上下文 ID 值被分配一个新的 ASID
所以当ASID用完时cpu会自动增加,并且当上下文切换内核会检查是否设置了高位(旧ASID),如果是,则为任务创建新的ASID。这样就可以避免我上面提到的问题。
谢谢。