2017-04-07 44 views
0

据我所知,CPU的内存访问涉及CPU缓存和MMU。 CPU将尝试在高速缓存中找到其目标,如果发生高速缓存未命中,CPU将转为MMU。在MMU访问期间,对应页表项的被访问/脏位将由硬件置位。但是据我所知,大多数CPU设计不会触发MMU,除非有一个缓存未命中,这里我的问题是,页表项的被访问/脏位仍然会被设置在缓存命中下?或者它与建筑相关?访问内存时,访问页表/脏位是否会设置在缓存命中状态下?

回答

0

大多数缓存实际上都是索引编制和物理标记的,以便更快访问。所以CPU发出虚拟地址和地址的索引位用于定位条目。在此期间,地址被发送到TLB以获取物理地址。到高速缓存具有所定位的条目时,TLB将返回物理地址,然后用于TAG比较。没有两件事情会发生。

  1. TLB不能有条目(TLB错过)​​
  2. 高速缓存标记不匹配(高速缓存未命中)

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

在2的情况下,如果TLB已经返回了有效的映射,您只需要获取它。如果TLB alss存在未命中(即1和2),则需要从PTE获取物理地址并获取数据。

所以要回答你的问题,如果是HIT,PTE不需要知道这一切。

+0

Thx,所以答案是,如果缓存命中和TLB命中都发生,PTE的位不会被设置? –

+0

据我所知,是的。 –

0

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

这是可能的从一个干净的页面缓存行之前写的)。这种情况有点不常见,因为在访问数据之前通常需要初始化数据,但页面可能先前被换出,然后重新安装到页面映射中(确切的行为将取决于操作系统,但有可能)。

在这种情况下,该行会被缓存(假设是专有的),然后您就可以写入该行。 CPU将并行访问高速缓存和TLB,试图在高速缓存中查找该行,同时也进行TLB访问以验证完整的虚拟标记,假设系统是物理映射的 - 虚拟标记为近期大多数CPU。 TLB过程可以通过TLB命中或者未命中跟随页面遍历来完成,以从存储器中的实际页面映射中安装TLB条目。

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

+0

谢谢,我认为操作系统偶尔会清除页表中被访问的位(例如在页面回收期间),因此缓存的页面可能会被取消设置其访问位。我不确定我是否完全理解您的答案,但是您是否意味着访问没有脏/访问位集的页面会导致页面错误? –

+0

是的。如果代码访问这样一个页面,你会得到一个错误。另一方面,如果操作系统以某种方式更改页面映射(可能在外部进程或内核中),则需要强制更新缓存在TLB中的副本,因此通常会得到TLB击落 – Leeor