1

我有一个关于 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?

4

4 回答 4

2

在 vaddr a1 处理 1 一些数据,在 vaddr a2 处理 2。我从 1 到 2 的上下文切换。在执行期间,对应于 a1 的 TLB 条目被弹出(出于某种原因)。进程 2 访问 a1,发生 TLB 未命中,发生页面遍历,成功并使用 ASID2 值存储进程 1 的条目,使进程 2 可以访问进程 1 的数据。

当进程1要访问vaddr a1时,实际上是一个标记为vaddr_a1_with_asid_P1的地址。当进程2要访问vaddr a1时,实际上是一个标记为vaddr_a1_with_asid_P2的地址。所以在 TLB 中,每个 TLB 条目都包含 vaddr 和进程 ASID 信息。

那么“进程 2 访问 a1,发生 TLB 未命中,发生页面遍历,成功并使用 ASID2 值存储进程 2 的条目”将不会发生。

即使对于同一个 vaddr a1,两个不同的进程访问 a1 也会产生两个不同的 TLB 条目。一个标有 ASID P1,另一个标有 ASID P2。

可选问题:如果我所有的程序在同一个虚拟地址有 .text 部分(至少,所有程序都有相同的入口点地址),我是否需要在每次上下文切换时更新表,或者我可以有几个匹配相同的条目vaddr,使用不同的 ASID?

Actullay,操作系统会照顾好这一点。例如,Linux 操作系统会为一个进程分配一个唯一的 ASID。对于 8 位或 16 位 ASID 寄存器,总的 ASID 范围是有限的。

所以当所有的 ASID 都用完后,Linux OS 将使整个 TLB 失效,并从 0 重新分配 ASID 号作为第二个循环的开始。

于 2017-03-14T07:08:38.110 回答
1

看来我对 ASID 有误解。感谢@artlessnoise 的评论,我得到了答案。

在我所描述的情况下,我错过了我们必须在某些时候映射进程 2 的页面这一事实。

所以我们实际上要做的是:
- 更新表:添加进程 2 的页面,并删除进程 2 不能看到的任何页面(包括,在我的示例中,地址处的页面a1
- 更改 ASID,因此任何具有旧 ASID 的缓存值都不能在 TLB 中使用
- 启动进程 2。如果进程 1 的相应页面仍然缓存在 TLB 中,则将其忽略(因为 ASID 不匹配)。在这两种情况下,都会发生页面遍历,更新后的表只包含进程 2 可访问的页面。

因此,(主要)安全性由进程 2 运行时出现的表提供。TLB中的额外安全性仅由 ASID 机制提供,允许我们在每次上下文切换时不刷新 TLB。

编辑:另一个(牵强的)解决方案是禁用非缓存页面的页面遍历(改为触发 MMU 故障),并在每次进程访问非缓存页面时手动检查(从内核)进程权限。在性能方面(以及设计方面)似乎很糟糕。

于 2017-03-15T14:03:05.427 回答
-1

使用 ASID 的 TLB 保护

使用上述机制可以避免 TLB 刷新,但是缓存条目呢?缓存不会在上下文切换时刷新(当 ASID 位更改时)。缓存都不包含 ASID 位。例如。

  1. 进程 1 和进程 2 在那里。
  2. 首先,进程 1 正在执行,TLB 有与进程 1 相关的 ASID 位。
  3. 这导致缓存填充了进程 1 的数据(假设进程 1 根据 PAGE TABLE 使用 pa1 和 pa2 条目填充缓存)。
  4. 现在有一个上下文切换。
  5. 来自进程 2 的核心的 va 将在 TLB 中具有不同的 ASID 位,因此这将是 TLB 未命中并且会有页表遍历。
  6. 与进程 2 相关的新 PTE 进入 TLB,所以现在它是 TLB 命中。
  7. TLB 命中导致在缓存中搜索数据(其中包含与进程 1 相关但尚未失效或刷新的数据)
  8. 因此,可能存在进程 1 的 pa 可能与进程 2 的 pa 重叠的情况,因此即使存在 TLB 保护,进程之间似乎也没有数据保护

--我是不是在某个地方错了,或者我没有考虑一些基本的事情,请告诉....

于 2018-03-16T01:39:20.663 回答
-1

缓存中会有 PA 比较,VIPT对于 Process2VA1映射到PA_process_2_with_asid_proc2.

所以这将是Process2访问的缓存未命中。

于 2018-03-22T02:39:56.553 回答