5

据我所知,CPU的内存访问涉及CPU缓存和MMU。CPU 将尝试在缓存中找到其目标,如果发生缓存未命中,CPU 将转向 MMU。在 MMU 访问过程中,对应页表项的访问/脏位将由硬件设置。

但是据我所知,除非缓存未命中,否则大多数 CPU 设计都不会触发 MMU,而我的问题是,页表条目的访问/脏位是否仍会设置为缓存命中?还是与架构有关?

4

3 回答 3

5

我认为您可以假设这些位缓存在 TLB 中,如果 TLB 中的值和内核完成的访问有任何不一致,将采用微码辅助并更新这些位。例如,如果 A 1或 D 位为零并且发生访问或存储,则将检测到此条件并设置适当的位。

您还可以假设 TLB 命中的快速路径无法进入内存,并查看缓存的 TLB 位是否与 RAM 中的 PTE 一致。此外,在 x86 上,对 PTE 的更改不会以缓存无效的方式通过硬件推送到 TLB;也就是说,TLB是不连贯的。

这意味着如果位在某些方面不同步,它们可能不会被正确更新。例如,如果在 TLB 中设置了 A (resp. D) 位,并且发生了访问 (resp. store),那么即使 A (resp. D) 位实际上在 PTE 中未设置,也不会发生任何事情。对位进行更改的实体负责刷新 TLB,以便将来正确更新位。


1有一个 TLB 条目A == 0很奇怪:您希望该条目作为访问的结果而存在,因此A从一开始就设置了位。也许在某些情况下可能会发生这种情况,例如由推测访问或预取引入的页面。

于 2020-01-25T17:20:33.833 回答
1

大多数缓存都经过虚拟索引和物理标记,以便更快地访问。所以CPU发出虚拟地址,地址的索引位用来定位入口。在此期间,地址被发送到 TLB 以获取物理地址。当缓存找到条目时,TLB 将返回物理地址,然后用于 TAG 比较。现在可能发生两件事。

  1. TLB 无法获得条目(TLB 未命中)
  2. Cache TAG mismatch(缓存未命中)

在1的情况下,需要访问页表项(PTE)才能得到正确的物理地址。

2的情况,如果TLB返回了一个有效的映射,你只需要获取它。如果 TLB 也有未命中(即 1 和 2),那么您需要从 PTE 获取物理地址并获取数据。

因此,要回答您的问题,如果发生 HIT,PTE 不需要全部了解。

于 2017-04-07T15:21:31.337 回答
1

如果页面一开始就没有被访问过,你通常不会有缓存命中,所以这个问题是无关紧要的。(编辑:想一想,在一些奇怪的页面别名情况下可能会出现这种情况,但是对于脏位的相同答案也适用于那里)

可以从干净的页面(以前从未写入过)中获得缓存行。这有点不常见,因为您通常需要在访问数据之前对其进行初始化,但是该页面之前可能已被换出然后重新安装到页面映射中(确切的行为将取决于操作系统,但这是可能的)。

在这种情况下,该行被缓存(假设是专门的),然后您写入它。CPU 将并行访问高速缓存和 TLB,尝试在高速缓存中查找行,同时还进行 TLB 访问以验证完整的物理地址,假设您的系统是虚拟索引的 - 物理标记就像现在大多数 CPU 一样。TLB 过程可以通过 TLB 命中或未命中然后页面遍历来完成,以从内存中的实际页面映射安装 TLB 条目。

在完成 TLB 访问(以及必要时的页面遍历)之前,缓存访问无法完成,此时您将知道访问/脏位的值。如果您尝试写入没有设置脏位的页面(或访问没有访问位的页面) - 您将收到页面错误,触发操作系统去更新页表中的页面。此时操作系统可能会选择进行各种优化,但最终会纠正这些位。

于 2017-04-09T13:36:11.663 回答