如何处理ASID的情况在Linux内核中用完了?

ARM体系结构中的ASID(地址空间标识符)占用寄存器中的8位.这意味着可以分配256个ASID.但是在
Linux内核中,甚至可以同时运行1024个以上的任务.如何处理ASID的情况在Linux内核中用完了?

我检查了内核源代码,当ASID用完时,内核会再次从启动时将ASID分配给新任务.考虑到一种情况,最新任务拥有第一个ASID(0b1000 0000 0000 0001),但是有一个任务必须已经拥有相同的ASID.如果这两个任务需要cantext切换怎么办?我没有找到相关的内核源代码.

linux内核中的相关代码在〜/ kernel / core.c context_switch().非常感谢任何回复,提前感谢

最好的祝福.

最佳答案 我已经找到了一些关于它的说明,如下(Cortex -A9程序员指南P8-20):

ASID是动态分配的,并且不能保证在a的生命周期内保持不变

处理.由于ASID寄存器仅提供ASID空间的多个位,因此我们可以拥有更多

Linux有一个用于分配ASID的方案,而不是256个进程.对于新流程,我们增加

使用的最后一个ASID值.达到最后一个值时,我们必须采取一些措施. TLB

刷新(跨SMP系统中的所有处理器).上下文中前24位的值

ID寄存器可以被视为“生成”号,递增.踏上一个

新一代意味着上一代的所有ASID值现在都是无效的

ASID编号重新启动.在上下文切换中,使用较旧代的进程

为上下文ID值的版本分配新的ASID

因此,当ASID用完时,cpu将自动递增,并且当上下文切换内核将检查是否设置了高位(旧ASID)时,如果是,则为任务创建新的ASID.这样可以避免我上面提到的问题.

谢谢.

点赞