使用WinDBG观察启用PAE后的分页机制 我在《软件调试》一书的2.7节介绍了CPU的分页机制,因为这属于这本书的支持性内容,考虑篇幅限制,没有介绍启用PAE的情况。书出版后,很多读者对这一内容很感兴趣,也有读者遇到了启用PAE的情况。因此决定写这篇短文来介绍一下PAE的概况,以及如何在启用PAE后的系统中做2.7.5节的试验。 PAE是 Physical Address Extension的缩写,即物理地址扩展。简单来说,就是把IA-32处理器的寻址能力从原来的4GB扩展到64GB。寻址4GB空间,要求物理地址的宽度为32位。类似的,要寻址64GB空间,那么物理地址的宽度就是36位。因为这个原因,PAE又被称为PAE-36bit。 如果从CPU的引脚来讲,那么支持PAE的CPU原则上应该有36根地址线,但因为IA-32 CPU的前端总线是64位宽,每次可同时传递8个字节数据。因此实际上省略了低三位地址线。以奔腾4 CPU为例,它的地址线是A[35:3]#。也就是说,CPU在访问内存时,它总是向前端总线给出一个低3位为0的地址,这实际上也起到了将地址按8字节对齐的功效。 PAE功能是P6处理器的第一代产品,Pentium Pro所引入的(参见《软件调试》35页),此后的IA-32 CPU都支持这一特征。系统软件可以使用CPUID指令检测当前运行的CPU是否支持PAE。控制寄存器CR4的第5位(CR4[5])用来启用PAE (参见《软件调试》44页)。 因为当IA-32 CPU工作在32位模式时,软件中使用的是32位宽的虚拟地址和线性地址,因此便产生了一个问题,如何将32位宽的线性地址翻译为36位宽的物理地址?答案是将原来的二级映射扩展为三级映射,也就是在原来的页目录和页表基础上再增加一级,称为页目录指针表。根据单个内存页的大小不同(4KB或者2MB)又分为两种情况。图1 启用PAE时将线性地址翻译为物理地址(4KB内存页)(摘自IA-32手册卷3A) 上图中画出的是4KB内存页的情况。其中的PDPTR是Page Directory Pointer Table Register的缩写,它是启用PAE后CR3寄存器的别名。此时,32位线性地址被分割为如下三个部分: * 2位(位30和位31)的页目录指针表索引,用来索引本地址在页目录指针表中的对应表项。 * 9位(位21-29)的页目录表索引,用来索引本地址在页目录表中的对应表项。 * 9位(位12-20)的页表索引,用来索引本地址在页表中的对应表项。 * 12位(位0-11)的页内偏移,这与以前是相同的。 与没有启用PAE的4KB情况(参见《软件调试》2.7.4节)相比,有以下不同: 表的数量由原来的两张变为三张。 因为表中的地址都是物理地址,所以三张表的每个表项都有原来的32位变为64位,具体格式如下图所示。
![]()
使用WinDBG观察启用PAE后的分页机制
最新推荐文章于 2023-06-04 11:45:14 发布