Windows内存管理-分页

0x00前言

这是《深入解析Windows Kenrel》系列文章的第1章 第三篇

0x01未开启PAE分页模式

cr0 寄存器pg位为1就是开启分页模式之后说有的地址都是虚拟地址 经过换算得到物理地址再去访问

ps=0时

 

ps=1时

 

 

 

 

 

计算方法,这里的pde 是页目录 pte 页表  cr3 是物理地址  下面是个实际例子

 

 

 

这里取得 31-12位 地址后面都要补充000 因为页大小是4k ,他们的字段分别是

 

 

 英特尔手册上面的

 

 

 

 

0x02开启PAE分页32位模式

 

 

 可以看到在开启pae 模式 物理地址扩展模式   32根地址线变成52根 这是 64位cpu 运行时 扩展方法

32位扩展 应该是 36为地址线 这里演示是64位 cpu 运行32的程序 地址  

64位cpu 默认是48位地址线 开启扩展是52位计算方法一样

 

 

 开启pae标志位  在cr4寄存器的第6个位置, 比没开启时多加了一个 pdpte 表 用来多寻址多的4根线地址

pde ps位=0 就是4kb的页, ps=1 就是2mb的页

 

每个标志位  多加了xd标志页的执行权限

 

 

 

 

 

 

0x03开启PAE分页64位模式

 

 

 和上面一样 多加了 pml4e 用来寻址更多的线

 

 

 

 

 

 

 

 

 其实没什么东西 按照里面的地址会拆分就行 知道怎么算物理地址

0x04 32位解析例子

 

 

 cr4 拆分  第6个是 1 开启了pae模式  这是一个32位系统按照上面32地址拆分

6f9=  xxxx 1111 xxxx  

8003f000 地址 拆分

10    0 0000 0000     0 0011 1111     0000  0000  0000

offset :0

pdpt:2

pde:0

pte:3f

这里找就是

cr3地址*1000h+2*8=pdpt地址

 

 

 页目录地址就是 000717000  偏移0

 

 

 页目录属性  163= xxxx  0110  xxxx  ps=0 是一个4k的页  接着看 4k 页表解析就行了

 

 

 pa=00003f000+0 offset  就是真实物理地址

 

 

 和 gdtr 一样   0

 

 

 如果是2mb的页也是按照上面的方法找对应图表的地址解析

0x05 64位解析例子

 

 

 看前面图知道 64位 默认是48跟线  后面都是保留位   真实地址 f88003faa9a8   

 

 

 

找gdtr 物理地址 64位系统 cr3=3ea64

f80005115000

1  1111 0000      0 0000 0000      0 0010 1000         1 0001 0101          0000 0000 0000

offset :000

pml4: 115

pdpt:1f0

pde:28

pte:115

 

 

 得到pml4表

 

 得到页目录指针表   063=xxxx 0110 xxxx  ps=0第8位不是1 不是1gb的页 

 

 得到pte 表  063  ps=0 不是2mb 的页   这是是4k的页 代表按 4k页 地址解析

 

 得到页表地址

 

 对比2个地址

 

 

一样找的没错

 

posted @ 2021-12-12 10:15  紅人  阅读(551)  评论(0编辑  收藏  举报