处理页表

时间:2011-07-08 17:00:22

标签: c windows assembly x86 kernel

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

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

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

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

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

2 个答案:

答案 0 :(得分:10)

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

  1. 对于x86架构,决定分页策略的不是操作系统,而是CPU(更具体地说是MMU)。操作系统如何查看分页系统与其实现方式无关。正如一位评论者正确指出的那样,分页模型有一个特定于操作系统的组件。这从属于硬件的处理方式。
  2. 32位和64位x86处理器具有不同的分页方案,因此如果不指定处理器的字大小,就无法真正谈论x86分页模型。
  3. 以下是32位x86分页模型的大规模压缩版本,使用最简单的版本。还有许多额外的调整是可能的,我知道各种操作系统都在使用它们。我不会进入那些因为我并不熟悉大多数操作系统的内部结构,因为在你掌握了更简单的东西之前,你真的不应该深入研究它们。如果您想了解x86分页模型的所有奇妙怪癖,可以访问英特尔文档:Intel System Programming Guide

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

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

    64位系统具有 4级分页系统,因为它们的内存空间更加稀疏。此外,页面大小可能不是4KB。

    要真正回答你的问题:

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

答案 1 :(得分:1)

总的来说,这非常正确。

如果记忆服务,虽然有一些细节有点不对:

  1. 内核内存的分页不会因进程而改变,因此内核始终可以看到所有页表。
  2. 理论上,还有一个基于细分的翻译步骤。然而,大多数实际系统(例如,* BSD,Linux,Windows,OS / X)使用其基数设置为0的段并限制设置为地址空间限制,因此该步骤最终基本上是NOP。