我有兴趣对虚拟内存和页面机制有更深入的了解,尤其是对于Windows x86系统。根据我从各种在线资源中收集到的信息(包括在SO上发布的其他问题),
1)每个进程的单独页表位于同一进程的内核地址空间内。
2)每个进程只有一个页面表,其中包含虚拟页面到物理页面(或框架)的映射。
3)本质上,由内存管理单元(MMU)计算与给定虚拟地址对应的物理地址,方法是将提供的虚拟地址的前20位用作页表的索引,并使用该索引来检索内存的起始地址。物理帧,然后根据虚拟地址的其余12位向该地址应用一些偏移量。
这三个说法正确吗?还是我误解了这些信息?
最佳答案
因此,首先让我们澄清一些事情:
接下来是使用最简单版本的32位x86分页模型的大规模压缩版本。还有许多其他可能的调整,而且我知道各种操作系统都在使用这些调整。我不打算讨论这些内容,因为我对大多数操作系统的内部并不十分熟悉,并且因为除非您对较简单的内容有所了解,否则您真的不应该讨论这些内容。如果您想了解x86分页模型的所有奇妙之处,可以转到Intel文档:Intel System Programming Guide
在最简单的分页模型中,存储空间分为4KB的块(称为页面)。其中的1024个连续块映射到页表(大小也为4KB)。为了进一步提高间接性,所有1024个页表都映射到4KB页目录,并且该目录的基础位于处理器中的特殊寄存器
%cr3
中。这两个层次的结构是适当的,因为OS中的大多数内存空间都是稀疏的,这意味着其中大部分未使用。您不想在周围保留一堆页表来存储未被触及的内存。当您获得内存地址时,最高有效的10位索引将进入页面目录,这将为您提供页面表的基础。接下来的10位索引到该页表中,以为您提供物理页的基础(也称为物理框架)。最后,最后12位索引到帧中。假设您已将
%cr3
设置为正确的值,则MMU会为您完成所有这些操作。64位系统具有4级分页系统,因为它们的存储空间稀疏得多。另外,页面大小可能不是4KB。
实际回答您的问题:
编辑:清理和较小的修改。