首页
社区
课程
招聘
[原创]2-9-9-12分页
发表于: 2023-9-4 09:23 4114

[原创]2-9-9-12分页

2023-9-4 09:23
4114

1、2-9-9-12分页

10-10-12分页中,物理地址的寻址大小是由PTE中的高20位页基址+低12位页偏移决定的,2^32=4G。随着硬件的发展,4G物理地址范围已经不能满足使用了,因此需要对物理地址进行扩展,最直接的方法就是增加物理地址的宽度,为了表示方便添加1个16进制位,即4个2进制位,最后物理地址达到了36位,可以表示的大小为2^36=64G。为了满足4字节对齐,PTE由原来的4字节扩展到了8字节。此时,PET也能存储到4G以外的物理地址了,因此也需要将PDE中的基址位扩展到36位,由原来的4字节扩展到8字节,这样PDE才能找到扩展后的PTE。
操作系统规定物理页的对齐大小是4K,所以当PDE和PTE都扩展到8字节后,而PDT和PTT的大小依旧是4K,所以它们的项数由原来的1024个变为512个。此外,512个地址范围需要9位2进制位才能表示,所以PDI=PTI=9,至此,9-9-12共30位已经解释清楚。还剩余2个2进制位扮演了CR3访问PDT的桥梁,CR3中存储的是PDPT的物理首地址,PDPT中包含了4个PDPTE,每个PDPTE的大小是8字节,其中访问PDT的物理地址由24位 基址+12位偏移组成。
至此,2-9-9-12分页的各项均已介绍。2-9-9-12分页访问的线性地址大小是2^2*2^9*2^9*2^12=4G,物理地址的寻址大小是2*36=64G。

2、实验:在xp系统2-9-9-12分页模式下,通过拆分线性地址找到物理地址。

1
2
3
4
5
线性地址:0106D900
00  -> 0
00 0001 000 -> 8*8 = 40
0 0110 1101 -> 6D*8 = 368
900
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
DirBase: 0aa80320  ObjectTable: e1c22698  HandleCount: 215.
 Image: notepad.exe
  
 kd> !dq 0aa80320 + 0    // 通过CR3访问PDPT.base + PDPTI访问PDPTE
# aa80320 00000000`7fed9801 00000000`80a5a801
# aa80330 00000000`7ea5b801 00000000`7d0d8801
 
kd> !dq 7fed9000 + 40    // 通过PDPTE.base + PDI访问PDE
#7fed9040 00000000`7fb73867 00000000`7c0c7867
#7fed9050 00000000`98c70867 00000000`00000000
#7fed9060 00000000`00000000 00000000`00000000
#7fed9070 00000000`00000000 00000000`7f5c0867
#7fed9080 00000000`00000000 00000000`00000000
#7fed9090 00000000`00000000 00000000`00000000
#7fed90a0 00000000`00000000 00000000`7fac1867
#7fed90b0 00000000`7f482867 00000000`00000000
 
kd> !dq 7fb73000 + 368   // 通过PED.base + PTI访问PTE
#7fb73368 80000000`80f5f867 80000000`7e665867
#7fb73378 80000000`82526867 80000000`7c755867
#7fb73388 80000000`80398867 80000000`8042e867
#7fb73398 80000000`7f95c867 80000000`7289b867
#7fb733a8 80000000`8181e867 80000000`8091f867
#7fb733b8 80000000`7fca0867 80000000`82c5d867
#7fb733c8 80000000`80a1a867 80000000`81861867
#7fb733d8 80000000`812b8867 80000000`806b9867
 
kd> !db 80f5f000 + 900   // 通过PTE.base + 物理页偏移0x900访问字符串Hello Word的物理地址
#80f5f900 48 00 65 00 6c 00 6c 00-6f 00 20 00 57 00 6f 00 H.e.l.l.o. .W.o.
#80f5f910 72 00 64 00 6f 00 72 00-64 00 44 00 00 00 00 00 r.d.............
#80f5f920 00 00 00 00 14 00 89 00-04 00 06 00 15 01 08 01 ................
#80f5f930 00 25 0b 01 80 ad 31 04-c0 a6 31 04 01 00 89 00 .%....1...1.....
#80f5f940 08 00 00 00 01 00 00 00-02 00 04 00 48 00 0b 01 ............H...
#80f5f950 20 25 0b 01 e0 a6 31 04-02 00 02 00 1b 01 08 01  %....1.........
#80f5f960 30 23 2d 04 00 00 00 ff-36 00 02 00 1d 01 0d 01 0#-.....6.......
#80f5f970 20 0f 07 01 e0 4f d0 20-ea 3a 69 10 a2 d8 08 00  ....O. .:i.....

通过观察物理地址:#7fb73368 80000000`80f5f867,可以发现PET的最后高位是1,即XD标志位(AMD中称为NX,即No Excetion),PDE | PTE中的XD位共同控制物理页的可执行属性,用以弥补10-10-12分页中页保护的不足。XD == 0:该页数据可执行;XD == 1:该页数据不可执行。

3、特殊的线性地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
3.1特殊的线性地址(PDT页目录表基址):0xC0600000
11 *8 -> 0x18
0 0000 0011 *8 -> 0x18
0 0000 0000 *8 -> 0
000
 
PROCESS 89f30a48  SessionId: 0  Cid: 07f4    Peb: 7ffda000  ParentCid: 05c4
    DirBase: 0aa802a0  ObjectTable: e1d6ce40  HandleCount: 168.
    Image: notepad.exe
 
kd> !dq 0aa802a0 + 18    // 特殊的线性地址:0xC0600000的PDPTE
# aa802b8 00000000`876ca801 00000000`578dc801
# aa802c8 00000000`5789d801 00000000`5789e801
# aa802d8 00000000`5785b801 00000000`5362c801
# aa802e8 00000000`5356d801 00000000`534ee801
# aa802f8 00000000`5352b801 00000000`531e1801
# aa80308 00000000`531e2801 00000000`531a3801
# aa80318 00000000`53160801 00000000`bae71340
# aa80328 00000000`5c2ad801 00000000`5c1ee801
kd> !dq 876ca000 + 18    // 特殊的线性地址:0xC0600000的PDE
#876ca018 00000000`876ca863 00000000`8774e863
#876ca028 00000000`8773f863 00000000`00000000
#876ca038 00000000`0a864963 00000000`0a865963
#876ca048 00000000`0a866963 00000000`0a867963
#876ca058 00000000`0a868963 00000000`0a869963
#876ca068 00000000`0a86a963 00000000`0a86b963
#876ca078 00000000`0a86c963 00000000`0a86d963
#876ca088 00000000`0a86e963 00000000`0a86f963
kd> !dq 876ca000 + 0 // 特殊的线性地址:0xC0600000的PTE
#876ca000 00000000`876cb863 00000000`8770c863
#876ca010 00000000`8770d863 00000000`876ca863
#876ca020 00000000`8774e863 00000000`8773f863
#876ca030 00000000`00000000 00000000`0a864963
#876ca040 00000000`0a865963 00000000`0a866963
#876ca050 00000000`0a867963 00000000`0a868963
#876ca060 00000000`0a869963 00000000`0a86a963
#876ca070 00000000`0a86b963 00000000`0a86c963
kd> !dq 876cb000 + 0 // 特殊的线性地址:0xC0600000的物理地址
#876cb000 00000000`87b00867 00000000`87663867
#876cb010 00000000`87637867 00000000`00000000
#876cb020 00000000`8774b867 00000000`87881867
#876cb030 00000000`876b1867 00000000`87a5e867
#876cb040 00000000`872f3867 00000000`87c86867
#876cb050 00000000`00000000 00000000`00000000
#876cb060 00000000`00000000 00000000`00000000
#876cb070 00000000`00000000 00000000`87dff867
---------------------------------------------
 
kd> !dq 0aa802a0 + 0 // 线性地址:0的PDPTE
# aa802a0 00000000`876cb801 00000000`8770c801
# aa802b0 00000000`8770d801 00000000`876ca801
# aa802c0 00000000`578dc801 00000000`5789d801
# aa802d0 00000000`5789e801 00000000`5785b801
# aa802e0 00000000`5362c801 00000000`5356d801
# aa802f0 00000000`534ee801 00000000`5352b801
# aa80300 00000000`531e1801 00000000`531e2801
# aa80310 00000000`531a3801 00000000`53160801
kd> !dq 876cb000 + 0 // 线性地址:0的PDE
#876cb000 00000000`87b00867 00000000`87663867
#876cb010 00000000`87637867 00000000`00000000
#876cb020 00000000`8774b867 00000000`87881867
#876cb030 00000000`876b1867 00000000`87a5e867
#876cb040 00000000`872f3867 00000000`87c86867
#876cb050 00000000`00000000 00000000`00000000
#876cb060 00000000`00000000 00000000`00000000
#876cb070 00000000`00000000 00000000`87dff867
 
结论:
一个PDPTE指向一个4KB大小的PDT
线性地址 0xC0600000 + 0KB + 0x0 = 0xC0600000 的物理页等于 PDPTE0 -> PDE0
线性地址 0xC0600000 + 4KB + 0x0 = 0xC0601000 的物理页等于 PDPTE1 -> PDE0
线性地址 0xC0601000 + 4KB + 0x0 = 0xC0602000 的物理页等于 PDPTE2 -> PDE0
线性地址 0xC0602000 + 4KB + 0x0 = 0xC0603000 的物理页等于 PDPTE3 -> PDE0
 
所以:
PDE = 0xC0600000 + PDPTI*4KB + PDI*8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
3.2特殊的线性地址(PTT页表基址):0xC0000000
11 *8 -> 0x18
0 0000 0000  -> 0
0 0000 0000  -> 0
000
 
结论:
一个PDPTE指向一个包含512个PDE的PDT,其中一个PDE指向一个4KB大小的PTT。因此,一个PDPTE的寻址大小是:512*4KB = 2MB = 0x200000
一个PDE指向一个4KB大小的PTT
线性地址 0xC0000000 + 0x000000 + 0x0 + 0x0 = 0xC0000000 的物理页等于 PDPTE0 -> PDE0 -> PTE0
线性地址 0xC0000000 + 0x200000 + 0x0 + 0x0 = 0xC0200000 的物理页等于 PDPTE1 -> PDE0 -> PTE0
线性地址 0xC0200000 + 0x200000 + 0x0 + 0x0 = 0xC0400000 的物理页等于 PDPTE2 -> PDE0 -> PTE0
线性地址 0xC0400000 + 0x200000 + 0x0 + 0x0 = 0xC0600000 的物理页等于 PDPTE3 -> PDE0 -> PTE0
 
PTE = 0xC0000000 + PDPTI*2M + PDI*4K + PTI*8   

补充:

每个PDPTE项可以给1GB线性地址寻址1GB物理内存,所以:

线性地址的最高2位为0,线性地址的寻址范围: 0x00000000-0x3FFFFFFF

线性地址的最高2位为1,线性地址的寻址范围: 0x40000000-0x7FFFFFFF

线性地址的最高2位为2,线性地址的寻址范围:0x80000000-0xBFFFFFFF

线性地址的最高2位为3,线性地址的寻址范围:0xC0000000-0xFFFFFFFF


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 914
活跃值: (2553)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
2

2023-9-4 09:55
0
雪    币: 1223
活跃值: (4727)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
https://bbs.kanxue.com/upload/attach/202309/690570_K6MJS8XYWWWVFDW.gif
2023-9-14 01:35
0
雪    币: 3594
活跃值: (31031)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2023-9-14 09:44
1
游客
登录 | 注册 方可回帖
返回
//