问题 TLB是否会导致内存中的页面错误?


在加州大学伯克利分校的John Kubiatowicz(Kuby教授)关于操作系统的视频讲座中,他提到TLB命中并不意味着相应的页面在主内存中。页面错误仍然可能发生。
从技术上讲,TLB是页表条目的缓存,因为所有页表条目都没有在主内存中提供相应的页面。 TLB也是如此。 TLB命中可能导致页面错误。

但根据教科书中给出的算法,我无法找到这样的案例。在TLB未命中内核上引用页表并更新TLB高速缓存以进行适当的地址转换。下一次TLB命中不能导致页面错误。当内核换出页面时,它会更新该页表条目的相应位并使相应的TLB无效,因此下次在主内存中加载页面之前不会有TLB命中。

那么有人可以代表kuby教授的主张的正确性,并指出一个案例,而不是TLB命中(TLB中找到的相应虚拟地址的翻译物理地址),会发生页面错误吗?


4848
2018-06-18 20:46


起源

Andy Glew的CompArch wiki有一个页面 缓存TLB中的无效条目 这可能是有趣的。 - Paul A. Clayton
由于CompArch wiki目前无法正常工作,因此我发布了CompArch wiki条目的副本 缓存无效条目。 (我也发布了 其他一些人。) - Paul A. Clayton


答案:


一个例子是如果存储器访问与允许的存储器访问不同。

例如你想写入写保护的内存。 TLB存在,它是一个命中,地址被翻译。但是在访问时你得到一个陷阱,因为你试图写入只读的内存


12
2018-06-18 21:42



+1另一个类似的例子是私有映射,第一次点击写时复制页面。这不仅会生成陷阱,还会导致内核创建一个全新的页面。这一页 可以 如果您之前只是阅读过它,请加入TLB。有趣的是内核在这种情况下会做什么,但是......保留两个TLB条目,或只是新条目,或者......?我想这可能是后者,因为TLB相当短暂,但我不确定。 - Damon
+1这看起来非常有效。 - Terminal
虽然你的答案提供了一些新思路,但仍然陷阱不是页面错误。内核将拒绝访问而不是在内存中重新加载该页面。 - Terminal
@Damon:两个进程可以为内存中的不同页面框架具有相同的虚拟地址。内核必须有一些标签(我不知道实际机制)但仍然内核区分2个不同进程的2个相同虚拟地址。我认为同样的情况适用于copy(on-write)页面,这是fork()系统调用的情况。在创建新的页面副本之后,虽然这两个页面具有相同的虚拟地址,但内核仍然可以保留两个条目,因为它们在fork之后属于不同的进程。 - Terminal
在浏览了rwong的链接后,我回复了上面的评论。你的答案是真的。 - Terminal


页面错误并不意味着内存中缺少页面。页面仍然存在并且很脏。这也是一个页面错误。 一般说来,页面错误是指无法有效使用获得的翻译的场景。 它可能是缺少页面或脏页面或访问权限不匹配。 因此TLB命中仍然可能导致页面错误。


2
2017-10-30 18:53





帕特森说:“如果内存中没有页面,则TLB中无法翻译”[计算机组织与设计,第4版修订,第507页]


-2
2017-11-08 14:44



注意,TLB有两个含义:(1)作为所有基于存储器的高速缓存系统中的通用逻辑组件,(2)特别是作为虚拟地址到物理地址转换步骤的架构组件。上面的陈述仅适用于(1),即失败的内存访问不会导致任何内容被添加到缓存中。然而,当TLB指的是完全由OS控制的MMU(存储器管理单元)时,转换表完全由OS指定,包括指示“如果该虚拟地址被命中则发出软件陷阱”的条目。 - rwong
否则,您引用的语句就不再符合现代CPU架构了。 - rwong
第三种可能性是:缓存系统,用于缓存MMU转换表中常用的条目。在这种情况下,你引用的作者是正确的(作为一个意见)说,缓存一个映射到非法访问的条目没有什么意义,但在现代CPU和操作系统中,使用虚拟分页系统(假装具有比物理内存空间更大的虚拟内存空间) 猖獗 缓存这些条目也是非常有意义的,因为你肯定会经常多次访问它们。 - rwong