我有一个关于虚拟内存管理的问题,更具体地说是地址转换。
当应用程序运行时,CPU接收包含虚拟内存地址的指令,并通过页表将它们转换为物理地址。
我的问题是,由于页表也放在内存块中,这是否意味着CPU必须在单个内存访问指令中访问内存两次?如果答案是否定的,那么这实际上是如何工作的?我错过了哪一部分?
有人能给我一些关于此的细节吗?
答案 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