1

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

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

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

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

4

2 回答 2

1

像往常一样,答案既不是肯定的,也不是否定的。

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

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

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

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

于 2013-11-02T11:21:13.877 回答
0

有时。

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

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

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

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

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

于 2013-11-02T11:14:47.847 回答