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个地址
一样找的没错