内存地址转换是否需要额外访问内存?

时间:2013-11-02 11:05:35

标签: virtual-memory

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

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

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

有人能给我一些关于此的细节吗?

2 个答案:

答案 0 :(得分:1)

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

最糟糕的情况是你必须对页面表进行操作,它实际上存储在(某种类型的)内存中,这不一定只是一次查找,它可以是多次查找,例如参见{{3} (来自维基百科的例子)。

但是,通常此页表伴随着名为two-level table的硬件辅助,这实际上是页表的缓存,查找过程可以在translation lookaside buffer中看到。它就像你期望缓存一样工作,如果查找成功你很乐意继续物理提取,如果它失败你继续前面的页面漫步,然后你更新缓存。

此硬件辅助通常以this image实现,这是网络处理中最常用的,但在此处也非常有用。它是一个内存组件,不基于地址进行查找,而是基于“内容”或任何通用密钥(密钥不必是连续的,递增数字)。在这种情况下,密钥将是您的虚拟地址,结果内存查找将是您的物理地址。由于这个CAM是一个单独的组件,因为它非常快,你可以说,只要你点击它就不会产生额外的虚拟内存开销 - >物理地址翻译。

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

答案 1 :(得分: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