图 4-1 给出了 i386 内存的分段模型,同时说明了逻辑地址和线性地址的关系 。为了更清晰些,我将描述符表( descriptor table )和段( segment )画的比较小 。实际上, 32 位的操作系统通常采用 图 4-2 所示的分段方案,这就是所谓的平滑内存模型( flat memory model ),它采用一个 4GB 大小的段 。这种方案的不足是,描述符表变成了段的一部分,从而可以被有足够权限的代码访问到 。
typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;
typedef union _LARGE_INTEGER
{
struct
{
ULONG LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER;
列表 4-1. PHYSICAL_ADDRESS 和 LARGE_INTEGER 结构的定义
图 4-1. i386 的内存分段
图 4-2 给出的内存模型被 Windows 2000 作为标准的代码、数据和堆栈段,这意味着,所有的逻辑地址将包括 CS 、 DS 、 ES 和 SS 段寄存器 。FS 和 GS 的处理方式有所不同 。Windows 2000 并不使用 GS 寄存器,而 FS 寄存器被专门用来保存位于线性地址空间中的系统数据区域的基地址 。因此, FS 的基地址远大于 0 ,其大小不会超过 4GB。有趣的是, Windows 2000 为用户模式和内核模式分别维护两个不同的 FS 段 。稍后我们将详细讨论这一问题 。
图 4-2. 平滑的 4GB 内存段
在 图 4-1 和 图 4-2 中,逻辑地址的 selector 指向描述符表,该描述符表由名为 GDTR 的寄存器指定 。这是 CPU 的全局描述符表寄存器,该寄存器可由操作系统设置为任何适当的线性地址 。GDT (全局描述符表)的第一项是保留的,该项对应的 selector 叫做“ null segment selector ” 。Windows 2000 将其 GDT 保存在 0x80036000。GDT 可容纳多达 8,19264 位的条目,即其最大值为 64KB。Windows 2000 仅使用开始的 128 个项,并将 GDT 的大小限制为 1,024 字节 。随 GDT 一起, i386 CPU 还提供了一个本地描述符表( Local Descriptor Table , LDT )和一个中断描述符表( Interrupt Descriptor Table , IDT ),这两个表的起始地址分别保存在 LDTR 和 IDTR 这两个寄存器中 。GDTR 和 IDTR 的值是唯一的, CPU 执行的每个任务都采用相同的值,而 LDTR 的值则是任务相关的, LDTR 可容纳一个 16 位的 selector。
图 4-3 示范了复杂的线性地址与物理地址的转换机制,如果在 4KB 分页模式下,并允许请求式分页, i386 的内存管理单元就会采用此种转换机制 。图中左上角的页目录基址寄存器( Page-Directory Base Register , PDBR )包含页目录的物理地址 。PDBR 由 i386 的 CR3 寄存器保存 。仅用该寄存器的高 20 位来寻址 。因此,页目录也是以页为边界的 。PDBR 的剩余位作为标志位或保留以便将来扩展使用 。页目录占用一个完整的 4KB 页,由包含 1024 个页目录项( Page-Directory Entry )的数组构成,每个页目录项均为 32 位 。和 PDBR 类似,每个 PDE 被划分为一个 20 位的页帧计数器( Page-Frame Number , PFN )和一个标志数组 。PFN 用来寻址页表 。每个页表都是按页对齐的,包含 1024 个页表项( Page-Table Entry , PTE ) 。每个 PTE 的高 20 位作为一个指针指向一个 4KB 的数据页 。通过将线性地址分为三段来实现地址转换:高 10 位用来选择一个 PDE (属于页目录),接下来的 10 个位选择前面所选的 PDE 中的某个 PTE ,最后剩下的 12 个位用来指定在数据页中的偏移量,该数据页由前面所选的 PTE 确定 。
图 4-3. 两层间接模型(采用 4KB 页)
在 4MB 分页模式下,事情就变得很简单了,这是因为消除了一个间接层,如 图 4-4 所示 。此时, PDBR 仍然指向页目录,但仅使用了每个 PDE 的高 10 位,这是因为目标地址采用 4MB 对齐 。因为没有使用页表,这个地址同样也是 4MB 数据页的基地址 。所以,此时的线性地址只包含两个部分: 10 个位用来选择 PDE ,其余的 22 位作为偏移量 。4MB 内存方案的开销没有 4KB 那么大,这是因为仅页目录需要附加的内存 。这 1024 个 PDE 中的每个都可寻址一个 4MB 页 。这足够覆盖整个 4GB 地址空间了 。所以, 4MB 分页的优势就是可以降低内存管理的开销,但结果就是寻址粒度较大 。
推荐阅读
- Windows 2000下的Raw Socket编程
- Windows 2000开发过程中一些有趣的数据
- Windows2000软件冲突一例
- 大叔与少年什么时候开始播
- 盛世嫡妃好看吗
- 命令篇 Windows 2000/XP的CMD命令教程 (2)
- 如何手动删除 Windows NT 或 Windows 2000
- Windows 2000系统编程——进程的创建
- 4 《Undocumented Windows 2000 Secrets》翻译 --- 第四章
- 3 《Undocumented Windows 2000 Secrets》翻译 --- 第四章
