我有一个关于 ARMv8-A 中的 TLB 和 ASID 的快速问题。
据我了解(来自 ARM 的程序员指南和架构参考手册):
- 页面/块描述符(叶 MMU 表条目)不包含 ASID 标识符,只有一个 nG(非全局)位,表示应该使用 ASID对于这个页面。
- 与寄存器值匹配的实际 ASID 值驻留在 TLB 中。它在发生页面遍历并将相应条目添加到 TLB 时设置(使用当前 ASID,以便后续 TLB 查找将检查新 ASID 是否匹配)。
假设我想使用 ASID 来避免在上下文切换时更新表。每个进程都有一个常驻的 ASID 值。在 vaddr 处理 1 一些数据,在 vaddra1
处理 2 a2
。我将上下文从 1 切换到 2。在执行期间,对应的 TLB 条目a1
被弹出(出于某种原因)。进程 2 访问a1
,发生 TLB 未命中和页面遍历,成功并使用 ASID2 值存储进程 1 的条目,使进程 2 可以访问进程 1 的数据。
我不明白什么?ASID 机制不应该在进程 1 和 2 之间提供安全性,同时避免更新表吗?
可选问题:如果我的所有程序都有.text
相同虚拟地址的部分(至少,所有程序都具有相同的入口点地址),我是否需要在每次上下文切换时更新表,或者我是否可以有多个匹配相同 vaddr 的条目,使用不同的 ASID?