【问题标题】:Can a TLB hit lead to page fault in memory?TLB 命中会导致内存页面错误吗?
【发布时间】:2011-09-17 22:25:44
【问题描述】:

在网络上可用的 John Kubiatowicz(Kuby 教授)的 UC Berkley 视频讲座中,他提到 TLB 命中并不意味着相应的页面在主内存中。页面错误仍然可能发生。
从技术上讲,TLB 是页表条目的缓存,因为所有页表条目在主内存中都没有相应的可用页面。 TLB 也是如此。 TLB 命中可能会导致页面错误。

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

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

【问题讨论】:

标签: memory-management operating-system kernel cpu-architecture tlb


【解决方案1】:

一个例子是内存访问与允许的不同。

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

【讨论】:

  • +1 另一个类似的例子是私有映射,这是第一次访问写入时复制页面。这不仅会产生一个陷阱,还会导致内核创建一个全新的页面。如果您之前只阅读过该页面,则该页面可能位于 TLB 中。有趣的是内核在这种情况下会做什么,虽然......保留两个 TLB 条目,或者只保留新条目,或者......?我想可能是后者,因为 TLB 的寿命很短,但我不确定。
  • 尽管您的回答提供了一些新的思考视角,但仍然陷阱不是页面错误。内核将拒绝访问,而不是在内存中重新加载该页面。
  • @Damon:两个进程对于内存中的不同页面帧可以有相同的虚拟地址。内核必须有一些标签(我不知道实际的机制),但内核仍然可以区分 2 个相同的2个不同进程的虚拟地址。我认为同样的情况适用于写时复制页面,这是 fork() 系统调用的情况。在创建新的页面副本后,虽然两个页面具有相同的虚拟地址,但内核仍然可以保留这两个条目,因为它们在fork之后属于不同的进程。
  • 在浏览了 rwong 的链接后,我收回了我的上述评论。你的回答是真实的。
  • RWong 删除了他的答案,linked to these lecture notes。转发给没有足够代表的未来读者以查看已删除的答案。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    patterson 说:“如果内存中不存在页面,则无法在 TLB 中进行翻译”[计算机组织和设计,第 4 版修订,第 507 页]

    【讨论】:

    • 注意TLB有两个含义:(1)作为所有基于内存的缓存系统中的通用逻辑组件,(2)具体作为虚拟地址到物理地址转换步骤中的架构组件。您上面的陈述仅适用于(1),即失败的内存访问不会导致将任何内容添加到缓存中。但是,当 TLB 指的是完全受 OS 控制的 MMU(内存管理单元)时,转换表完全由 OS 指定,包括指示“如果命中此虚拟地址,则发出软件陷阱”的条目。
    • 否则,您引用的语句根本不再符合现代 CPU 架构。
    • 还有第三种可能:缓存系统设计用来缓存来自 MMU 转换表的常用条目。在这种情况下,您引用的作者是正确的(根据意见),缓存映射到非法访问的条目没有什么意义,但是在现代 CPU 和操作系统中,使用虚拟分页系统(假装拥有比物理内存空间更大的虚拟内存空间)是如此猖獗,因此缓存这些条目也非常有意义,因为您肯定会多次访问它们.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 2021-05-12
    • 2022-11-24
    相关资源
    最近更新 更多