据我所知,CPU的内存访问涉及CPU缓存和MMU。 CPU将尝试在高速缓存中找到其目标,如果发生高速缓存未命中,CPU将转为MMU。在MMU访问期间,对应页表项的被访问/脏位将由硬件置位。但是据我所知,大多数CPU设计不会触发MMU,除非有一个缓存未命中,这里我的问题是,页表项的被访问/脏位仍然会被设置在缓存命中下?或者它与建筑相关?访问内存时,访问页表/脏位是否会设置在缓存命中状态下?
回答
大多数缓存实际上都是索引编制和物理标记的,以便更快访问。所以CPU发出虚拟地址和地址的索引位用于定位条目。在此期间,地址被发送到TLB以获取物理地址。到高速缓存具有所定位的条目时,TLB将返回物理地址,然后用于TAG比较。没有两件事情会发生。
- TLB不能有条目(TLB错过)
- 高速缓存标记不匹配(高速缓存未命中)
在1的情况下,你需要访问页表项(PTE)至得到正确的物理地址。
在2的情况下,如果TLB已经返回了有效的映射,您只需要获取它。如果TLB alss存在未命中(即1和2),则需要从PTE获取物理地址并获取数据。
所以要回答你的问题,如果是HIT,PTE不需要知道这一切。
如果页面从来没有被访问过,那么通常不会有缓存命中,所以这个问题是无关紧要的。 (编辑:来想一想,它可能在一些奇怪的页面别名的情况下,但同样的答案的脏位适用于那里)
这是可能的从一个干净的页面缓存行之前写的)。这种情况有点不常见,因为在访问数据之前通常需要初始化数据,但页面可能先前被换出,然后重新安装到页面映射中(确切的行为将取决于操作系统,但有可能)。
在这种情况下,该行会被缓存(假设是专有的),然后您就可以写入该行。 CPU将并行访问高速缓存和TLB,试图在高速缓存中查找该行,同时也进行TLB访问以验证完整的虚拟标记,假设系统是物理映射的 - 虚拟标记为近期大多数CPU。 TLB过程可以通过TLB命中或者未命中跟随页面遍历来完成,以从存储器中的实际页面映射中安装TLB条目。
只有当TLB访问(如果需要,页面遍历)完成之后,缓存访问才能完成,此时您将知道访问/脏位的值。 如果您尝试写入未设置脏位的页面(或访问没有访问位的页面),您将收到页面错误,触发操作系统去更新页面表中的页面。操作系统可能会选择在这一点上进行各种优化,但最终会导致纠正这些位。
谢谢,我认为操作系统偶尔会清除页表中被访问的位(例如在页面回收期间),因此缓存的页面可能会被取消设置其访问位。我不确定我是否完全理解您的答案,但是您是否意味着访问没有脏/访问位集的页面会导致页面错误? –
是的。如果代码访问这样一个页面,你会得到一个错误。另一方面,如果操作系统以某种方式更改页面映射(可能在外部进程或内核中),则需要强制更新缓存在TLB中的副本,因此通常会得到TLB击落 – Leeor
- 1. C访问内存位置
- 2. 内存访问和缓存
- 3. SMTP从缓存中访问旧设置?
- 4. 缓存访问
- 5. 访问缓存ODBC连接设置
- 6. SSRS URL访问设置保存位置?
- 7. 是否可以访问WebView缓存?
- 8. 访问内存缓存项目
- 9. 对内存位置的无效访问
- 10. 通过内存位置访问变量
- 11. Android - 访问存储位置
- 12. mmap是否直接访问页面缓存或页面缓存的副本?
- 13. 内联缓存未命中时V8如何访问属性?
- 14. 动态内存访问是否对实时程序有害?
- 15. 本地内存访问是否合并?
- 16. 使用PhoneGapBuild时访问设备内存
- 17. 在使用redux时,是否在反应状态下访问状态?
- 18. CPU内存访问时间
- 19. 从Clojure访问Coherence命名缓存
- 20. 我的代码中是否存在无效的内存访问?
- 21. 是否存在标准iOS弹出为启用访问位置?
- 22. 同时访问共享内存是否会导致性能下降?
- 23. Facebook。使用访问令牌设置状态(离线访问)
- 24. fread后访问内存缓冲区()
- 25. MIPS内存访问
- 26. Haswell内存访问
- 27. 高速缓存未命中时的平均访问时间
- 28. 当处理器访问内存映射寄存器时,它是否实际访问设备
- 29. 设置和访问分布式缓存的问题
- 30. Priority_queue问题内存访问
Thx,所以答案是,如果缓存命中和TLB命中都发生,PTE的位不会被设置? –
据我所知,是的。 –