2024年3月31日发(作者:)

内存管理技术内幕,第一部分

理解NT的基本内存运作

无论计算机安装了多少内存,似乎从来就没有感到足够过。Windows NT所面对的最复杂

和困难的任务之一就是要管理好计算机上有限的物理内存。NT必须为可能同时运行的多个进

程划分物理内存以提供给每个进程适当的一份的事实更加强了这个挑战。此外,NT还必须能

在一个从少到16MB到多达1GB或更多的宽广的内存大小范围中调整自己的行为。

本月我将介绍基于硬件支持的内存分页的虚拟内存概念。这个专栏将为理解NT怎样定

义进程和地址空间打下基础。我将讨论NT怎样分配虚拟内存地址和记录分配情况的内部数据

结构。我也将讲解两个NT内存管理的强有力的特色:内存共享和写时拷贝。下个月,我会描

述更多的内部数据结构,NT怎样实现共享内存和工作集调整。

虚拟内存

正如包括Windows 3.x,Windows 95,Win98,和UNIX在内的几乎所有现代操作系统(OSs)

那样,NT要依赖于硬件支持来使每个进程产生计算机拥有比实际更多的内存的错觉。产生这

个错觉的机制被称为分页虚拟内存,内存管理器(或虚拟内存管理器)执行体子系统是负责

NT的分页虚拟内存和导出其它子系统和应用程序可以用来与虚拟内存地址空间交互的函数的

NT组件。进程在它们自己的虚拟内存地址空间中访问内存。在NT中,一个进程的地址空间

大小是由32比特可以描述的字节数来定义的,就是2^32,或4GB(在Alpha和Intel

Merced--Deschutes处理器上可用的64位NT将具有2^64字节的寻址能力)这样一来,除了

其它的资源限制,一个进程从理论上可以分配到4GB的代码和数据。然而,目前多数计算机

只有少于128MB的物理内存。一个进程的4GB地址空间由此被称为虚拟内存,因为它们没有

直接地对应物理内存。

在我解释计算机的操作系统和硬件怎样配合起来欺骗进程来使它们认为自己拥有4GB的

内存以前,我将先看看内存地址转换。Alpha和X86处理器上的内存管理单元(MMU)以叫做

页的块来管理物理和虚拟内存。在X86处理器上,一页的大小是4KB,而Alpha处理器却维

护8KB大小的页面。计算机的物理内存页面被称为页帧,处理器是以页帧号(PFNs)来对页

帧连续编号的。

当一个进程涉及到自己的虚拟内存时,它是通过一个32位指针来访问的。MMU的工作就

是确定虚拟地址映射的物理内存位置。MMU通过把地址分成三个独立的索引来定位,如68页

图1所示:页目录索引,页表索引和页面字节偏移。MMU在一个三步地址解析过程中使用每

一个索引。

1

图1

第一步由MMU定位被称做页目录的表开始。MMU通过读取一个特殊硬件处理器寄存器的

内容来定位页目录表。在X86上这个寄存器是控制寄存器3(CR3),在Alpha上这个寄存器

是页目录寄存器(PDR)。每个进程拥有自己私有的页目录,并且那个目录的地址是存在进程

的控制块数据结构中。只要调度器把一个进程切换到另一个进程,NT就会把页目录寄存器更

新成接管CPU的进程的控制块中存储的值。解析过程的第一步紧接着是MMU利用从虚拟地址

中得到的页目录索引来索引页目录表。MMU检索页目录以求得另一个表,页表位置的页帧号。

页目录表中的项被叫做页目录项(PDEs)并且大小是32比特。

在解析过程的第二步中,MMU将从虚拟地址中得到的页表索引应用于MMU定位的页表。

MMU从页表索引处获得的入口项代表物理内存中的一个页帧。最后,在第三步中,MMU将页面

字节偏移作为一个索引运用于物理页面并得到进程想要访问的数据。页表中的项被叫做页表

项(PTEs)。与PDE相似,PTE也是32位宽。

也许你会对为什么MMU要历经这样的三个步骤(太多?不!)感到疑惑。它这样做是为

了节省内存。设想一个虚拟地址被分成两个部分的一步转换,其中一个在一个页表中定位一

个PTE而另一个作为页面偏移。要映射一个4GB的地址空间,页表必须包含1,048,576个

入口项。每项四个字节(32位等同于四个8位的字节)意味着页表将需要4MB的物理内存来

映射每个进程的地址空间。使用一个如X86和Alpha上那样的两级方案,只有进程的页目录

须完全定义--页表只须按需要来定义。这样,如果一个进程的4GB地址空间中的大部分没有

被分配物理内存的话,那么因为不需要分配页表来定义未使用的空间从而导致大量内存的节

省。

然而,如果在每次内存访问时都发生这样的三步转换过程(太慢!)则将会使系统的性

能变得无法忍受的差。因此X86和Alpha处理器自带了一个地址转换缓冲正如图2所示的那

一个,它储存了最近的虚拟页到物理页的转换。当一个进程进行一次内存访问时,MMU取得

虚拟页号并将它与存在缓冲中的每个转换对的虚拟页号同时进行比较(这种可同时比较的内

存被称为相关内存)。如果发现了一个匹配,则MMU可以绕过页目录表和页表的查找因为它已

2