处理页表

Jim*_*mmy 4 c windows x86 assembly kernel

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

1)每个进程的各个页表位于同一进程的内核地址空间内.

2)每个进程只有一个页表,包含虚拟页面到物理页面(或帧)的映射.

3)存储器管理单元(MMU)基本上通过使用提供的虚拟地址的前20位作为页表的索引来计算对应于给定虚拟地址的物理地址,使用该索引来检索开始地址.物理帧然后根据虚拟地址的剩余12位向该地址应用一些偏移量.

这三个陈述是否正确?还是我误解了这些信息?

Abh*_*uch 10

所以,首先让我们澄清一些事情:

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

接下来是32位x86分页模型的大规模压缩版本,使用最简单的版本.还有许多额外的调整是可能的,我知道各种操作系统都在使用它们.我不会进入那些因为我并不熟悉大多数操作系统的内部结构,因为在你掌握了更简单的东西之前,你真的不应该深入研究它们.如果您想了解x86分页模型的所有奇妙怪癖,可以访问英特尔文档:英特尔系统编程指南

在最简单的分页模型中,存储空间被分成称为页面的4KB块.其中1024个连续的块被映射到页表(大小也是4KB).对于更进一步的间接,所有1024页表都映射到4KB页目录,该目录的基础位于%cr3处理器的特殊寄存器中.由于OS中的大多数存储空间都是稀疏的,这意味着大多数存储空间未被使用,因此这种两级结构已经到位.对于未触及的内存,您不希望保留一堆页表.

当你得到一个内存地址时,最重要的10位索引进入页面目录,它为你提供了页表的基础.接下来的10位索引到该页表中,为您提供物理页面的基础(也称为物理帧).最后,最后12位索引到帧中.假设您已设置%cr3为正确的值,MMU会为您完成所有这些操作.

64位系统具有4级寻呼系统,因为它们的存储空间更稀疏.此外,页面大小可能不是4KB.

要真正回答你的问题:

  1. 所有这些分页信息(表,目录等)都位于内核内存中.请注意,内核内存是一个很大的问题,并没有为单个进程提供内核内存的概念.
  2. 每个进程只有一个页面目录.这是因为页面目录定义了一个内存空间,每个进程只有一个内存空间.
  3. 上面的最后一段为您提供了切断地址的方式.

编辑:清理和微小的修改.