使用WinDBG观察启用PAE后的分页机制

本文详细介绍了在启用PAE(Physical Address Extension)后,IA-32处理器的分页机制,包括三级映射的原理,并通过WinDBG在启用PAE的Windows XP SP2系统上进行实践,展示了如何将线性地址转换为物理地址的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
 
使用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)又分为两种情况。 https://i-blog.csdnimg.cn/blog_migrate/6e6a3c3f7f661cf5f250536c4d777b65.bmp 图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位,具体格式如下图所示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值