【问题标题】:Does memory address translation need extra access to memory?内存地址转换是否需要额外访问内存?
【发布时间】:2013-11-02 11:05:35
【问题描述】:

我有一个关于虚拟内存管理的问题,更具体地说,是地址转换。

当应用程序运行时,CPU 接收到包含虚拟内存地址的指令,并通过页表将它们转换为物理地址。

我的问题是,由于页表也在内存块中,这是否意味着 CPU 必须在单个内存访问指令中访问内存两次?如果答案是否定的,那么这实际上是如何工作的?我错过了哪一部分?

谁能给我一些关于这个的细节?

【问题讨论】:

    标签: virtual-memory


    【解决方案1】:

    像往常一样,答案既不是是也不是不是。

    最坏的情况是你必须遍历页表,它确实存储在(某种)内存中,这不一定是一次查找,它可以是多次查找,例如two-level table(来自维基百科的示例)。

    然而,通常这个页表伴随着一个称为translation lookaside buffer的硬件辅助,这本质上是一个页表缓存,查找过程可以在this image中看到。它的工作原理就像您期望缓存也可以工作一样,如果查找成功,您会愉快地继续物理提取,如果失败,您继续上述页面遍历,然后更新缓存。

    此硬件辅助通常以CAM (Content Addressable Memory) 的形式实现,它最常用于网络处理,但在这里也非常有用。它是一个内存组件,它不基于地址而是基于“内容”或任何通用键(键不必是连续的、递增的数字)进行查找。在这种情况下,键将是您的虚拟地址,而生成的内存查找将是您的物理地址。由于此 CAM 是一个单独的组件,而且速度非常快,因此您可以声明,只要您点击它,就不会为虚拟 -> 物理地址转换产生任何额外的内存开销。

    您可能会问他们为什么不将整个页表放入 CAM 中?很简单,CAM 既非常昂贵,更重要的是非常耗能,所以你不想让它们太大(我们不想要一台需要 1KW 才能运行的笔记本电脑吗?)。

    【讨论】:

      【解决方案2】:

      有时。

      MMU 包含一个虚拟到物理地址映射的缓存,称为 TLB(Translation Lookaside Buffer)。

      如果有问题的页面不在 TLB 中(TLB 未命中),则需要先将相关页表从主内存加载到该缓存中,这将需要额外的内存访问。

      最后,如果页面根本找不到,就会向 CPU 发出一个陷阱(页面错误),CPU 有机会修复这个问题 - 例如分配内存、从文件加载片段、交换空间等。

      具体如何完成的细节因架构而异,在某些情况下,TLB 未命中还涉及 CPU 来配置 TLB,尽管在大多数情况下这是自动的。 (但 CPU 在进行上下文切换时必须刷新 TLB,并为新进程加载新的页表)

      更多信息,例如这里https://www.kernel.org/doc/gorman/html/understand/understand006.html

      【讨论】:

        猜你喜欢
        • 2021-12-19
        • 1970-01-01
        • 2010-09-12
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多