默认情况下,windows xp以上都开启了pae(physical address extend),所以本文主要讲开启了pae之后的从虚拟地址到物理地址的转换。
我们知道,一个32位的计算机,假设每个字节的数指向一个内存地址,那么2^32=2^2*2^30=4*G;也就是说,如果不开启物理地址扩展,最多只能有4G的内存大小,但是我们都知道,即使是32的计算机他的内存也不止扩展到4G,解决办法是通过pae。
pae需要记住以下名词,
页目录指针表的索引(找页目录首地址)
页目录表的索引(找页表首地址)
页表索引(找页首地址)
页内偏移(找目标地址)
可以理解为找一行字的过程,
相对应是
书架
书
页
行
接下来解释pae的用法
PAE将一个32位的数分为如上四段.2+9+9+12=32,cr3是页目录指针表基址。
(通过这种方法最多可以有2^20个页,每个页的大小为4kByte。)
假设我们要查看的虚拟地址是0x17823966,通过windbg查看进程的dirbase即页目录指针表基址为0x12345678(随便一点的好),
假设是他的显示是这样的
地址 数据
0x12345678 0x25685428 0x35789615 0x15789635 0x32458916
我们首先将0x17823966转换为二进制 0001 0111 1000 0010 0011 1001 0110 0110
按图中划分 00 01 0111100 0 0010 0011 1001 0110 0110
指针表索引 页目录表索引 页表索引 页内偏移
0 188 35 2406
然后前两位是00所以就是0x12345678+0,也就是数据0x25685428,因此0x25685000就是页目录基址,通过
25685000+188*8得到页目录地址=25685ee0
定位25685ee0
假设如下所示
地址 数据
0x25685ee0 0x12573596 0x00000000 0x00000000 0x00000000
那么0x12570000就是页表基址,通过页表基址找到页表也是用同样的方法,
0x12570000+35*8得到页表0x12570118
通过页表加偏移,就是物理地址了。
0x12570118+2406=0x12570A7E(物理地址)
0x12570A7E