分页机制及映射过程

发布时间 2023-03-24 11:54:24作者: Hanpto

分页机制和映射过程
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
image

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

image

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八个
image
这里自己构建的 EPT 没有任何功能,0x87654321 转换后还是 0x87654321,可以自己构建
0x87654321 <-> 000000000 000000010 000111011 001010100 001100100001 <-> 0x0 0x2 0x3B 0x54 0x321
image

image
image

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