虚拟地址转物理地址

来源:互联网 发布:js的math.abs 编辑:程序博客网 时间:2024/06/05 16:03

默认情况下,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