我有兴趣更好地了解虚拟内存和页面机制,特别是 Windows x86 系统。根据我从各种在线资源收集的信息(包括在 SO 上发布的其他问题),
1) 每个进程的单独页表位于同一进程的内核地址空间内。
2) 每个进程只有一个页表,包含虚拟页到物理页(或帧)的映射。
3) 给定虚拟地址对应的物理地址是由内存管理单元(MMU)计算出来的,本质上是使用提供的虚拟地址的前20位作为页表的索引,使用该索引来检索页表的起始地址物理帧,然后根据虚拟地址的剩余 12 位向该地址应用一些偏移量。
这三种说法是否正确?或者我误解了这些信息?
因此,首先让我们澄清一些事情:
- 对于 x86 架构,决定分页策略的不是操作系统,而是 CPU(更具体地说是 MMU)。操作系统如何看待分页系统与其实现方式无关。正如评论者正确指出的那样,分页模型有一个特定于操作系统的组件。这从属于硬件的工作方式。
- 32 位和 64 位 x86 处理器具有不同的分页方案,因此如果不指定处理器的字大小,就无法真正谈论 x86 分页模型。
下面是 32 位 x86 分页模型的大规模压缩版本,使用的是最简单的版本。还有许多可能的额外调整,我知道各种操作系统都使用它们。我不会讨论这些,因为我不太熟悉大多数操作系统的内部结构,而且在掌握了更简单的东西之前,你真的不应该讨论这些。如果您想了解 x86 分页模型的所有奇妙之处,您可以访问 Intel 文档:英特尔系统编程指南 http://www.intel.com/Assets/PDF/manual/325384.pdf
在最简单的分页模型中,内存空间被划分为 4KB 的块,称为页。其中 1024 个连续块被映射到页表(大小也是 4KB)。对于进一步的间接级别,所有 1024 页表都映射到 4KB 页目录,并且该目录的基地址位于特殊寄存器中%cr3
在处理器中。这种两级结构的存在是因为操作系统中的大多数内存空间都是sparse这意味着其中大部分未被使用。您不想为未触及的内存保留一堆页表。
当您获得内存地址时,最高有效 10 位将索引到页目录中,从而为您提供页表的基础。接下来的 10 位索引到该页表中,为您提供物理页(也称为物理帧)的基础。最后,最后 12 位索引到帧中。 MMU 会为您完成所有这些工作,假设您已设置%cr3
到正确的值。
64位系统有一个4 level分页系统,因为它们的内存空间更加稀疏。此外,页面大小也可以不是 4KB。
要真正回答您的问题:
- 所有这些分页信息(表、目录等)都位于内核内存中。请注意,内核内存是一大块,并且不存在为单个进程提供内核内存的概念。
- 只有一页目录每个进程。这是因为页目录定义了一个内存空间,每个进程都只有一个内存空间。
- 上面的最后一段介绍了地址的分割方式。
编辑:清理和细微修改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)