假设您有一台64位计算机(这意味着 64位虚拟地址空间),其中有 4KB页和 4GB 物理内存。如果我们建议您使用一个级别页面表,则每个进程每个虚拟页面应包含一个条目。
每个虚拟页一个条目– 2 64 可寻址字节/ 2 12 每页字节= 2 52 页表条目< / strong>
一个页表项包含:访问控制位(类似于当前页,RW等位)+物理页号
4 GB的物理内存= 2 32 字节。
每页2 32 字节内存/ 2 / 12 字节每页= 2 20 个物理页面
物理页码需要20位。
因此每个页表条目大约为 4个字节。 (20位物理页号约为3个字节,访问控制贡献1个字节)
现在,页面表大小= 2 52 页面表项* 4字节= 2 54 字节( 16 PB strong>)!
那不只是物理内存,所以我们如何以及在哪里存储页表?
谢谢!
答案 0 :(得分:1)
页面表可能大于物理内存。您要做的是将表的一部分分页到辅助存储。
某些处理器实际上可以做到这一点。他们通过使用单独的系统和用户页面表避免了明显的鸡和蛋问题。系统页表映射到物理页框架,而用户页表映射到系统空间中的逻辑地址。
可能还有其他方法来实现比物理内存大的页表,而不是我所描述的那种。
答案 1 :(得分:0)
我还没有检查过数学,但是让我们退一步,问一个稍有不同的问题,为什么要映射整个可能的物理地址空间?
在具有支持分页的MMU的典型CPU上,存在的物理地址中只有一小部分是RAM或MMIO地址。其余的物理地址未使用。通常,如果您确实将那些未寻址设备的物理地址映射到虚拟地址,然后尝试访问它们,则会得到某种例外。
因此,实际上,页表的实际大小受可寻址的RAM和MMIO空间的大小限制。如果您有少量的RAM,则不需要示例中描述的庞大的页表。大多数条目将无效。
相反,如果您的系统确实有大量的RAM占用了大部分物理地址空间,则您将有更多的RAM来存储页表。
页表可以消耗所有RAM的另一种方式是通过使多个页表或具有许多虚拟地址映射到同一物理地址的表,但是此问题与该方案无关。
答案 2 :(得分:0)
我有点不喜欢这款游戏,但有一些评论和说明。
首先,这个问题暂时被夸大了(但并不十分夸张)。原因是,虽然大多数64位体系结构都允许将来扩展到64位虚拟地址空间,但据我所知,今天(2018年12月)尚不支持全部64位。例如,至强服务器当前支持48位。但是,即使是48位VA空间也足以引起问题。
第二个答案(由VxWizard提供)涉及到物理地址空间中的漏洞,在我看来似乎没有抓住重点。由于虚拟寻址的一个主要目的是要比PA具有更多的 VA空间,因此PA空间中的空洞与页表的大小无关。
现在回到原来的问题。显然,页表的大小可以大于所有物理内存,并且显然这意味着页表的某些部分可以被调出。但是,如何处理TLB遗漏呢?似乎TLB未命中可能意味着要从页表中获取-如果页表已被分页,则必须从磁盘中获取它。但是,指示磁盘中要提取位置的指针仍保存在磁盘中的页表中!
之所以不是无限递归的原因是因为无法整个页表。其中的一部分(特别是告诉页表本身在哪里的部分)无法调出。只要该部分保留在物理内存中,就可以了。
有很多方法可以实现这一目标。多级页表可以提供帮助,分隔用户空间和内核空间也可以提供帮助。但是所有这些必须满足的主要事情是,您必须在物理内存中具有足够的页表,以便能够在磁盘上找到其余的页表。