4

ARM 架构中的 ASID(地址空间标识符)在一个寄存器中占用 8 位。这意味着可以分配 256 个 ASID。但是在linux内核中甚至可以同时运行超过1024个任务。Linux内核中ASID用完的情况如何处理?我查过内核源码,当ASID用完时,内核会重新分配ASID给新的任务。考虑一种情况,最新的任务拥有第一个 ASID(0b1000 0000 0000 0001),但必须有一个任务已经拥有相同的 ASID。如果这两个任务需要cantext切换怎么办?我没有找到相关的内核源代码。linux内核中的相关代码在 ~/kernel/core.c context_switch() 中。任何回复将不胜感激,在此先感谢

此致。苍鹭

4

2 回答 2

3

我找到了一些相关说明,如下(Cortex -A9 程序员指南 P8-20): ASID 是动态分配的,不能保证在进程的生命周期内保持不变。由于 ASID 寄存器只提供 8 位 ASID 空间,而且我们可以拥有超过 256 个进程,Linux 有一个分配 ASID 的方案。对于新进程,我们增加最后使用的 ASID 值。当达到最后一个值时,我们必须采取一些行动。TLB 被刷新(跨 SMP 系统中的所有处理器)。上下文 ID 寄存器中前 24 位的值(可被视为“世代”编号)递增。进入新一代意味着上一代的所有 ASID 值现在都无效,并且重新开始 ASID 编号。在上下文切换中,使用旧版本的上下文 ID 值的进程被分配一个新的 ASID

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

谢谢。

于 2013-07-12T01:32:28.147 回答
0

这里有一个很好的解释:

https://community.arm.com/thread/8219

它主要与 Heron 的答案相匹配,只是它指的是 ASID 的位图,而不是仅仅递增到 255。

于 2016-06-07T15:44:57.480 回答