[旧帖]
[原创] 分段分页学习笔记
0.00雪花
发表于:
2011-10-22 18:38
3220
[旧帖] [原创] 分段分页学习笔记
0.00雪花
说明:所参考的图表在附件Intel手册中
环境Vmware XP(sp3) wingdb
一、未开启PAE
boot.ini
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - debug " /execute /fastdetect /debug /debugport=com1 /baudrate=115200
kd> r cr0
cr0=8001003b
PG = 1(31)位 启用分页机制
PE = 1(0)位 启用必面必在保护模式
kd> r cr4
cr4=000006d9
PSE(页尺寸扩展标志) 第4位 = 1
PAE(物理地址扩展标志) 第5位 = 0
步骤:
1. cr0 PG(31) = 1 启用分页机制
2. cr4 PSE(4) = 1
cr4 PAE(5) = 0 => 物理地址大小32位
3. 页目录表PDE的PS标志(7) = ?
001B:0041DB40处
CD 03 90 6A FF 68 90 DC 5B 00 68 B8 2B 42 00 64 A1 00 00 00 00 50 64 89 25
00 00 00 00 83 C4 A4
kd> dg cs
P Si Gr Pr Lo
Sel Base Limit Type l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
001B 00000000 ffffffff Code RE 3 Bg Pg P Nl 00000cfa
分段机制->线性地址:0041DB40
《intel手册》表3-3可知
由于 PAE = 0 -> 32位物理地址大小
PS = 0 时 4KB页 采用手册图3-12分解
PS = 1 时 4MB页 采用手册图3-13分解
由<Intel手册> 图3-12 或3-13可得PDE 从而由图3-14(4kb页32位物理地址)或 图3-15
(4M页32位物理地址) 得到PS标志位
kd> r cr3
cr3=0d8ee000
kd> !dd 0d8ee000
# d8ee000 0da74067 10973067 10659067 00000000
# d8ee010 00000000 00000000 00000000 00000000
# d8ee020 00000000 00000000 00000000 00000000
PDBR(cr3) = 0d8ee000 PS = 0
所以为4KB页,32位物理地址
因此根据图3-12可进行分解线性地址
directory Table offset
0041DB40 0000 0000 01 00 0001 1101 B40
1 1D B40
PDE[1] = 10973067
属性位 0000 0110 0111
P(0) = 1 在物理内存中
R/W(1) = 1 该组页可写(但结合段描述符,仍然只读?)
U/S(2) = 1 User 用户特权
PWT(page write throught页级直写标记3) = 0
PCD(page cached页级高速缓存禁用标志4) = 0
(6) = 1 为0??
A(5) = 1
PS(7) = 0 (该表项指向页表4KB?)
G(8) = 0 忽略
AVL(9 10 11)
kd> !dd 10973000+0x1D*4
#10973074 1ea19025 00000000 00000000 00000000
PTE[0x1D] = 1ea19025
属性位 0000 0010 0101
P(0) = 1 在物理内存中
R/W(1) = 0 该组页只读
U/S(2) = 1 User 用户特权
PWT(page write throught页级直写标记3) = 0
PCD(page cached页级高速缓存禁用标志4) = 0
A(5) = 1
D(6) = 0 未曾被写入过
PAT(页属性表索引7) = 0 (该表项指向页表4KB?)
G(8) = 0
AVL(9 10 11)
所以 001B:0041DB40 分段-> 线性地址:0041DB40 分页->对应物理地址为1ea19000 +
B40 = 1ea19b40
kd> !dd 1ea19b40
#1ea19b40 6a9003cd dc9068ff b868005b 6400422b
#1ea19b50 000000a1 89645000 00000025 a4c48300
二、开启PAE
Boot.ini文件
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - debug" /noexecute=optin /PAE /fastdetect /debug /debugport=com1 /baudrate=115200
kd> r cr0
cr0=8001003b
kd> r cr4
cr4=000006f9
步骤:
1. cr0 PG(31) = 1 启用分页机制
2. cr4 PSE(4) = 1
cr4 PAE(5) = 1 => 物理地址大小36位
3. 页目录表PDE的PS标志(7) = ?
若为0 4KB页 采用图3-18分解
若为1 2MB页 采用图3-19分解
001B:0041DB40处
kd> dg cs
P Si Gr Pr Lo
Sel Base Limit Type l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
001B 00000000 ffffffff Code RE 3 Bg Pg P Nl 00000cfa
001B:0041DB40 分段->0x0041DB40线性地址,对线性地址分解前两部分
Directory pointer(2位) Driectory(9位)
00 00 0000 010
0 2
kd> !dd cr3
# 4700300 109fc001 00000000 10bfd001 00000000(PAE 扩展成36位,用64位存储)
# 4700310 10a7e001 00000000 10a7b001 00000000
# 4700320 f8dbf340 00000000 00000000 00000000
取第0项109fc001 (P 0位有效 图3-20 图3-21)
即页目录指针表项DPE = PDPTR[0] = 109fc001(P=1)
kd> !dd 109fc000
#109fc000 10cdf067 00000000 10b6a067 00000000
#109fc010 10c9e067 00000000 10cdb067 00000000
取第2项 页目录表项PDE = 10c9e067 (P=1 第7位PS=0,该页目录表项指向4KB页表)
接着对线性地址0x0041DB40按图3-18分解
Directory pointer(2位) Driectory(9位) Table(9位) Offset(12位)
00 00 0000 010 0 0001 1101 B40
0 2 1D B40
kd> !dd 10c9e000+8*1D
#10c9e0e8 0f928025 00000000 00000000 00000000
对应页 PA = 0f928000(P=1在物理内存中)
所以001B:0041DB40 对应物理地址为 0f928000+B40 = 0f928B40
kd> !dd 0f928B40
# f928b40 6a9003cd dc9068ff b868005b 6400422b
# f928b50 000000a1 89645000 00000025 a4c48300
总结:
PAE= 0, PSE = 0, PS任意 对应图3-12;
PAE= 0, PSE = 1, PS = 0 对应图3-12;
PAE = 0, PSE = 1, PS = 1对应图3-13;
PAE = 1, PSE任意 PS = 0 对应图3-18;
PAE = 1 , PSE任意 PS = 1 对应图3-19.
后记:
感谢武汉科锐钱老师,方老师。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: