分页机制和映射过程
x86 : CR3-PDT-PTT-offset 10-10-12
x86 with PAE : CR3-PDPT-PDT-PTT-offset 2-9-9-12
EPT(x64) : EPTP-PML4E-PDPTE-PDE-PTE-offset 9-9-9-9-12
x86
x86 with PAE
CR4 寄存器的第 5 位为 1 说明开启了 PAE
intel 把 CPU 的管脚数从 32 增加到 36 来提高 CPU 寻址能力,这样可以索引到的页面由 2^20 变为 2^24,线性地址依然是 32 位,但物理地址是 36 位
同样一个物理页是 4 KB,PTE 能够索引的地址空间为 2^20 * 2^12 = 4GB,PAE 能够索引的地址空间为 2^24 * 2^12 = 64GB
eg:
点击查看代码
0x01012475 <-> 00 000001000 000010010 010001110101 <-> 0x0 0x8 0x12 0x475
cr3 = 0x017f02c0
解:
kd> !dd 017f02c0 + 0x0*0x8
# 17f02c0 06d13801 00000000 01d74801 00000000
kd> !dd 06d13801 + 0x8*0x8
# 6d13040 04250867 00000000 00000000 00000000
kd> !dd 04250867 + 0x12*0x8
# 4250867 056b7005 00000000 04d53005 00000000
kd> !db 056b7005
# 56b7005 48 65 6c 6c 6f 57 6f 72-6c 64 HelloWorld
EPT
一张表项所有项代表空间大小 256TB-512GB-1GB-2MB-4KB,一张表中的一项代表空间大小 512GB-1GB-2MB-4KB-1Byte
0x87654321 的二进制为 10000111011001010100001100100001
9-9-9-9-12 <-> 000000000 000000010 000111011 001010100 001100100001 <-> 0x0 0x2 0x3B 0x54 0x321
*EPTP 有多少个地址(8Byte=16个16进制数)就代表有多少项,即 a * 512GB,eg一个
*PDPTE 有多少个地址(8Byte=16个16进制数)就代表有多少项,即 b * 1GB,eg八个
*PDE 有多少个地址(8Byte=16个16进制数)就代表有多少项,即 c * ,eg八个
这里自己构建的 EPT 没有任何功能,0x87654321 转换后还是 0x87654321,可以自己构建
0x87654321 <-> 000000000 000000010 000111011 001010100 001100100001 <-> 0x0 0x2 0x3B 0x54 0x321
x64
PML4T(Page Map Level4 Table)及表内的PML4E结构,每个表为4K,内含512个PML4E结构,每个8字节
PDPT (Page Directory Pointer Table)及表内的PDPTE结构,每个表4K,内含512个PDPTE结构,每个8字节
PDT (Page Directory Table) 及表内的PDE结构,每个表4K,内含512个PDE结构,每个8字节
PT(Page Table)及表内额PTE结构,每个表4K,内含512个PTE结构,每个8字节。
点击查看代码
0x2ffde8 <-> 000000000 000000000 000000001 011111111 110111101000 <-> 0 0 1 0xff 0xde8
cr3 = 0x7d838000
kd> !dq 7d838000
# 7d838000 02b00000~7d274867 00000000~00000000
kd> !dq 7d274000
# 7d274000 03000000~7d737867 01900000~7d23f867
kd> !dq 7d737000 + 0x8
# 7d737008 01500000~7d7bb867 11700000~7b596867
kd> !dq 7d7bb000 + 0xff*8
# 7d7bb7f8 89a00000~7d084867 97300000~7afbc867
kd> !dq 7d084000 + 0xde8
# 7d084de8 48 65 6c 6c 6f 57 6f 72-6c 64 HelloWorld