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