我有兴趣对虚拟内存和页面机制有更深入的了解,尤其是对于Windows x86系统。根据我从各种在线资源中收集到的信息(包括在SO上发布的其他问题),

1)每个进程的单独页表位于同一进程的内核地址空间内。

2)每个进程只有一个页面表,其中包含虚拟页面到物理页面(或框架)的映射。

3)本质上,由内存管理单元(MMU)计算与给定虚拟地址对应的物理地址,方法是将提供的虚拟地址的前20位用作页表的索引,并使用该索引来检索内存的起始地址。物理帧,然后根据虚拟地址的其余12位向该地址应用一些偏移量。

这三个说法正确吗?还是我误解了这些信息?

最佳答案

因此,首先让我们澄清一些事情:

  • 在x86体系结构中,决定分页策略的不是操作系统,而是CPU(更确切地说是MMU)。操作系统如何看待分页系统与实现方式无关。正如评论者正确指出的那样,分页模型有一个特定于OS的组件。这从属于硬件的处理方式。
  • 32位和64位x86处理器具有不同的分页方案,因此,如果不指定处理器的字长,就不能真正谈论x86分页模型。

  • 接下来是使用最简单版本的32位x86分页模型的大规模压缩版本。还有许多其他可能的调整,而且我知道各种操作系统都在使用这些调整。我不打算讨论这些内容,因为我对大多数操作系统的内部并不十分熟悉,并且因为除非您对较简单的内容有所了解,否则您真的不应该讨论这些内容。如果您想了解x86分页模型的所有奇妙之处,可以转到Intel文档:Intel System Programming Guide

    在最简单的分页模型中,存储空间分为4KB的块(称为页面)。其中的1024个连续块映射到页表(大小也为4KB)。为了进一步提高间接性,所有1024个页表都映射到4KB页目录,并且该目录的基础位于处理器中的特殊寄存器%cr3中。这两个层次的结构是适当的,因为OS中的大多数内存空间都是稀疏的,这意味着其中大部分未使用。您不想在周围保留一堆页表来存储未被触及的内存。

    当您获得内存地址时,最高有效的10位索引将进入页面目录,这将为您提供页面表的基础。接下来的10位索引到该页表中,以为您提供物理页的基础(也称为物理框架)。最后,最后12位索引到帧中。假设您已将%cr3设置为正确的值,则MMU会为您完成所有这些操作。

    64位系统具有4级分页系统,因为它们的存储空间稀疏得多。另外,页面大小可能不是4KB。

    实际回答您的问题:
  • 所有这些分页信息(表,目录等)都位于内核内存中。请注意,内核内存是一个很大的挑战,并且没有为单个进程拥有内核内存的概念。
  • 每个进程只有一个页面目录。这是因为页面目录定义了一个内存空间,而每个进程恰好具有一个内存空间。
  • 上面的最后一段为您提供了地址分割的方法。

  • 编辑:清理和较小的修改。

    09-25 22:09