我有兴趣更好地了解虚拟内存和页面机制,特别是对于Windows x86系统。根据我从各种在线资源(包括在SO上发布的其他问题)收集的内容,
1)每个进程的各个页表都位于同一进程的内核地址空间中。
2)每个进程只有一个页表,包含虚拟页面到物理页面(或帧)的映射。
3)存储器管理单元(MMU)基本上通过使用提供的虚拟地址的前20位作为页表的索引来计算对应于给定虚拟地址的物理地址,使用该索引来检索物理帧的起始地址,然后根据虚拟地址的剩余12位将一些偏移量应用于该地址。
这三个陈述是否正确?或者我误解了这些信息?
答案 0 :(得分:10)
所以,首先让我们澄清一些事情:
以下是32位x86分页模型的大规模压缩版本,使用最简单的版本。还有许多额外的调整是可能的,我知道各种操作系统都在使用它们。我不会进入那些因为我并不熟悉大多数操作系统的内部结构,因为在你掌握了更简单的东西之前,你真的不应该深入研究它们。如果您想了解x86分页模型的所有奇妙怪癖,可以访问英特尔文档:Intel System Programming Guide
在最简单的分页模型中,内存空间被分为4KB块,称为页面。其中1024个连续的块被映射到页表(大小也是4KB)。对于更进一步的间接,所有1024页表都映射到4KB页目录,该目录的基础位于处理器中的特殊寄存器%cr3
中。由于操作系统中的大多数内存空间都是稀疏,这意味着大部分内存空间未使用,因此实现了这两级结构。你不想为未被触及的内存保留一堆页表。
当你得到一个内存地址时,最重要的10位索引进入页面目录,它为你提供了页表的基础。接下来的10位索引到该页表中,为您提供物理页面的基础(也称为物理帧)。最后,最后12位索引到帧中。假设您已将%cr3
设置为正确的值,MMU会为您完成所有这些操作。
64位系统具有 4级分页系统,因为它们的内存空间更加稀疏。此外,页面大小可能不是4KB。
要真正回答你的问题:
编辑:清理和微小修改。
答案 1 :(得分:1)
总的来说,这非常正确。
如果记忆服务,虽然有一些细节有点不对: