1 《Undocumented Windows 2000 Secrets》翻译 --- 第四章( 二 )


80286 CPU 引入了另一种模式,称为:受保护的虚拟地址模式,或者简单的称之为:保护模式 。该模式提供的内存模型中使用的物理地址不再是简单的将线性地址和段基址相加 。为了保持与 8086 和 80186 的向后兼容, 80286 仍然使用段寄存器,但是在切换到保护模式后,它们将不再包含物理段的地址 。替代的是,它们提供了一个选择器( selector ),该选择器由一个描述符表的索引构成 。描述符表中的每一项都定义了一个 24 位的物理基址,允许访问 16MB RAM ,在当时这是一个很不可思议的数量 。不过, 80286 仍然是 16 位 CPU ,因此线性地址空间仍然被限制在 64KB。
1985 年的 80386 CPU 突破了这一限制 。该芯片最终砍断了 16 位寻址的锁链,将线性地址空间推到了 4GB ,并在引入 32 位线性地址的同时保留了基本的选择器 / 描述符架构 。幸运的是, 80286 的描述符结构中还有一些剩余的位可以拿来使用 。从 16 位迁移到 32 位地址后, CPU 的数据寄存器的大小也相应的增加了两倍,并同时增加了一个新的强大的寻址模型 。真正的 32 位的数据和地址为程序员带了实际的便利 。事实上,在微软的 Windows 平台真正完全支持 32 位模型是在好几年之后 。Windows NT 的第一个版本在 1993 年 7 月 26 日发布,实现了真正意义上的 Win32 API。但是 Windows 3.x 程序员仍然要处理由独立的代码和数据段构成的 64KB 内存片, Windows NT 提供了平坦的 4GB 地址空间,在那儿可以使用简单的 32 位指针来寻址所有的代码和数据,而不需要分段 。在内部,当然,分段仍然在起作用,就像我在前面提及的那样 。不过管理段的所有责任都被移给了操作系统 。
80386 的另一个新特性是在硬件上支持分页,确切的来说是:请求式分页的虚拟内存 。这种技术允许一个不同于 RAM 的存储介质 ---- 硬盘来为内存提供支持,例如,在允许分页时, CPU 通过将最近最少访问的内存数据置换到备份存储器中,从而为新的数据腾出空间,这样就能访问比可用物理内存更大的内存空间 。理论上来说,可以使用此种方式访问 4GB 的连续线性地址空间,提供的备份介质必须足够的大 --- 即 使只安装了非常少的物理内存 。当然,分页并不是访问内存的最快方式,最好还是能提供尽可能多的物理内存 。但是,这是处理大量数据的最好办法,即使这些数据 超过了可用物理内存 。例如,图形和数据库程序都需要一大块工作内存,如果没有分页机制的话,其中的某些程序就无法在低档的 PC 系统中运行 。
【1 《Undocumented Windows 2000 Secrets》翻译 --- 第四章】80386 分页的模式是将内存划分为 4KB 或 4MB 大小的页 。操作系统的设计者可以在二者之间自由的选择,也可混合使用这两个大小的页面 。稍后,我会介绍 Windows 2000 采用的混合大小方案:由操作系统使用 4MB 的页面,而 4KB 页面由剩余的代码和数据使用 。这些页面由分层结构的页表树管理,该页表树记录当前位于物理内存中的页,同时还记录了每个页是否实际的位于物理内存中 。如果指定页已被置换到了硬盘上,而某些模块触及了位于这些页中的地址, CPU 就会产生一个缺页中断(这与外围硬件产生的中断类似) 。接下来,位于操作系统内核中的缺页中断处理例程会试图将该页再次调入物理内存,这可能需要将另一块内存中的数据写入硬盘以腾出空间 。通常,系统采用最近最少( LRU )算法来确定哪个页可以被置换出去 。现在可以很清楚地看到为什么有时将这个过程称为 ---- 请求式分页( demand paging ):即,由软件提出请求,然后根据操作系统和应用程序使用的内存的统计数据,将物理内存中的数据移动到后备存储设备中 。

推荐阅读