📄 jiurl玩玩win2k内存篇 分页机制 (二).htm
字号:
00000000 00000000 00000000 00000000<BR>c0001590: 00000000 00000000
00000000 00000000<BR>c00015a0: 00000000 00000000 00000000
00000000<BR>c00015b0: 00000000 00000000 00000000 00000000<BR>c00015c0:
00000000 00000000 00000000 00000000<BR>c00015d0: 00000000 00000000
00000000 00000000<BR>c00015e0: 00000000 00000000 00000000
00000000<BR>c00015f0: 00000000 00000000 00000000 00000000<BR>c0001600:
00000000 00000000 00000000 00000000<BR>c0001610: 00000000 00000000
00000000 00000000<BR>c0001620: 00000000 00000000 00000000
00000000<BR>c0001630: 00000000 00000000 00000000 00000000<BR>c0001640:
00000000 00000000 00000000 00000000<BR>c0001650: 00000000 00000000
00000000 00000000<BR>c0001660: 00000000 00000000 00000000
00000000<BR>c0001670: 00000000 00000000 00000000 00000000<BR>c0001680:
00000000 00000000 00000000 00000000<BR>c0001690: 00000000 00000000
00000000 00000000<BR>c00016a0: 00000000 00000000 00000000
00000000<BR>c00016b0: 00000000 00000000 00000000 00000000<BR>c00016c0:
00000000 00000000 00000000 00000000<BR>c00016d0: 00000000 00000000
00000000 00000000<BR>c00016e0: 00000000 00000000 00000000
00000000<BR>c00016f0: 00000000 00000000 00000000 00000000<BR>c0001700:
00000000 00000000 00000000 00000000<BR>c0001710: 00000000 00000000
00000000 00000000<BR>c0001720: 00000000 00000000 00000000
00000000<BR>c0001730: 00000000 00000000 00000000 00000000<BR>c0001740:
00000000 00000000 00000000 00000000<BR>c0001750: 00000000 00000000
00000000 00000000<BR>c0001760: 00000000 00000000 00000000
00000000<BR>c0001770: 00000000 00000000 00000000 00000000<BR>c0001780:
00000000 00000000 00000000 00000000<BR>c0001790: 00000000 00000000
00000000 00000000<BR>c00017a0: 00000000 00000000 00000000
00000000<BR>c00017b0: 00000000 00000000 00000000 00000000<BR>c00017c0:
00000000 00000000 00000000 00000000<BR>c00017d0: 00000000 00000000
00000000 00000000<BR>c00017e0: 00000000 00000000 00000000
00000000<BR>c00017f0: 00000000 00000000 00000000 00000000<BR>c0001800:
00000000 00000000 00000000 00000000<BR>c0001810: 00000000 00000000
00000000 00000000<BR>c0001820: 00000000 00000000 00000000
00000000<BR>c0001830: 00000000 00000000 00000000 00000000<BR>c0001840:
00000000 00000000 00000000 00000000<BR>c0001850: 00000000 00000000
00000000 00000000<BR>c0001860: 00000000 00000000 00000000
00000000<BR>c0001870: 00000000 00000000 00000000 00000000<BR>c0001880:
00000000 00000000 00000000 00000000<BR>c0001890: 00000000 00000000
00000000 00000000<BR>c00018a0: 00000000 00000000 00000000
00000000<BR>c00018b0: 00000000 00000000 00000000 00000000<BR>c00018c0:
00000000 00000000 00000000 00000000<BR>c00018d0: 00000000 00000000
00000000 00000000<BR>c00018e0: 00000000 00000000 00000000
00000000<BR>c00018f0: 00000000 00000000 00000000 00000000<BR>c0001900:
00000000 00000000 00000000 00000000<BR>c0001910: 00000000 00000000
00000000 00000000<BR>c0001920: 00000000 00000000 00000000
00000000<BR>c0001930: 00000000 00000000 00000000 00000000<BR>c0001940:
00000000 00000000 00000000 00000000<BR>c0001950: 00000000 00000000
00000000 00000000<BR>c0001960: 00000000 00000000 00000000
00000000<BR>c0001970: 00000000 00000000 00000000 00000000<BR>c0001980:
00000000 00000000 00000000 00000000<BR>c0001990: 00000000 00000000
00000000 00000000<BR>c00019a0: 00000000 00000000 00000000
00000000<BR>c00019b0: 00000000 00000000 00000000 00000000<BR>c00019c0:
00000000 00000000 00000000 00000000<BR>c00019d0: 00000000 00000000
00000000 00000000<BR>c00019e0: 00000000 00000000 00000000
00000000<BR>c00019f0: 00000000 00000000 00000000 00000000<BR>c0001a00:
00000000 00000000 00000000 00000000<BR>c0001a10: 00000000 00000000
00000000 00000000<BR>c0001a20: 00000000 00000000 00000000
00000000<BR>c0001a30: 00000000 00000000 00000000 00000000<BR>c0001a40:
00000000 00000000 00000000 00000000<BR>c0001a50: 00000000 00000000
00000000 00000000<BR>c0001a60: 00000000 00000000 00000000
00000000<BR>c0001a70: 00000000 00000000 00000000 00000000<BR>c0001a80:
01fd8067 00000000 00000000 00000000<BR>c0001a90: 00000000 00000000
00000000 00000000<BR>c0001aa0: 00000000 00000000 00000000
00000000<BR>c0001ab0: 00000000 00000000 00000000 00000000<BR>c0001ac0:
02ed9047 00000000 00000000 00000000<BR>c0001ad0: 00000000 00000000
00000000 00000000<BR>c0001ae0: 00000000 00000000 00000000
00000000<BR>c0001af0: 00000000 00000000 00000000 00000000<BR>c0001b00:
05d3c047 0243d047 006de047 0217f047<BR>c0001b10: 04f39047 0695a047
01c5b047 00000000<BR>c0001b20: 00000000 00000000 00000000
00000000<BR>c0001b30: 00000000 00000000 00000000 00000000<BR>c0001b40:
07596005 07597005 00000000 00000000<BR>c0001b50: 00000000 00000000
00000000 00000000<BR>c0001b60: 00000000 00000000 00000000
00000000<BR>c0001b70: 00000000 00000000 00000000 00000000<BR>c0001b80:
0272a047 00000000 00000000 00000000<BR>c0001b90: 00000000 00000000
00000000 00000000<BR>c0001ba0: 00000000 00000000 00000000
00000000<BR>c0001bb0: 00000000 00000000 00000000 00000000<BR>c0001bc0:
06825047 00000000 00000000 00000000<BR>c0001bd0: 00000000 00000000
00000000 00000000<BR>c0001be0: 00000000 00000000 00000000
00000000<BR>c0001bf0: 00000000 00000000 00000000 00000000<BR>c0001c00:
00000000 00000000 00000000 00000000<BR>c0001c10: 00000000 00000000
00000000 00000000<BR>c0001c20: 00000000 00000000 00000000
00000000<BR>c0001c30: 00000000 00000000 00000000 00000000<BR>c0001c40:
00000000 00000000 00000000 00000000<BR>c0001c50: 00000000 00000000
00000000 00000000<BR>c0001c60: 00000000 00000000 00000000
00000000<BR>c0001c70: 00000000 00000000 00000000 00000000<BR>c0001c80:
00000000 00000000 00000000 00000000<BR>c0001c90: 00000000 00000000
00000000 00000000<BR>c0001ca0: 00000000 00000000 00000000
00000000<BR>c0001cb0: 00000000 00000000 00000000 00000000<BR>c0001cc0:
00000000 00000000 00000000 00000000<BR>c0001cd0: 00000000 00000000
00000000 00000000<BR>c0001ce0: 00000000 00000000 00000000
00000000<BR>c0001cf0: 00000000 00000000 00000000 00000000<BR>c0001d00:
00000000 00000000 00000000 00000000<BR>c0001d10: 00000000 00000000
00000000 00000000<BR>c0001d20: 00000000 00000000 00000000
00000000<BR>c0001d30: 00000000 00000000 00000000 00000000<BR>c0001d40:
00000000 00000000 00000000 00000000<BR>c0001d50: 00000000 00000000
00000000 00000000<BR>c0001d60: 00000000 00000000 00000000
00000000<BR>c0001d70: 00000000 00000000 00000000 00000000<BR>c0001d80:
00000000 00000000 00000000 00000000<BR>c0001d90: 00000000 00000000
00000000 00000000<BR>c0001da0: 00000000 00000000 00000000
00000000<BR>c0001db0: 00000000 00000000 00000000 00000000<BR>c0001dc0:
04daf047 03c90047 05ba1047 03de2047<BR>c0001dd0: 00000000 00000000
00000000 00000000<BR>c0001de0: 00000000 00000000 00000000
00000000<BR>c0001df0: 00000000 00000000 00000000 00000000<BR>c0001e00:
00ef1047 052d2047 05573047 065f4047<BR>c0001e10: 01c55047 03a56047
03457047 045b8047<BR>c0001e20: 076d9047 037ba047 04f3b047
0347c047<BR>c0001e30: 033dd047 05a1e047 01dbf047 02220047<BR>c0001e40:
00000000 00000000 00000000 00000000<BR>c0001e50: 00000000 00000000
00000000 00000000<BR>c0001e60: 00000000 00000000 00000000
00000000<BR>c0001e70: 00000000 00000000 00000000 00000000<BR>c0001e80:
00000000 00000000 00000000 00000000<BR>c0001e90: 00000000 00000000
00000000 00000000<BR>c0001ea0: 00000000 00000000 00000000
00000000<BR>c0001eb0: 00000000 00000000 00000000 00000000<BR>c0001ec0:
00000000 00000000 00000000 00000000<BR>c0001ed0: 00000000 00000000
00000000 00000000<BR>c0001ee0: 00000000 00000000 00000000
00000000<BR>c0001ef0: 00000000 00000000 00000000 00000000<BR>c0001f00:
00000000 00000000 00000000 00000000<BR>c0001f10: 00000000 00000000
00000000 00000000<BR>c0001f20: 00000000 00000000 00000000
00000000<BR>c0001f30: 00000000 00000000 00000000 00000000<BR>c0001f40:
00000000 00000000 00000000 00000000<BR>c0001f50: 00000000 00000000
00000000 00000000<BR>c0001f60: 00000000 00000000 00000000
00000000<BR>c0001f70: 00000000 00000000 00000000 00000000<BR>c0001f80:
00000000 00000000 00000000 00000000<BR>c0001f90: 00000000 00000000
00000000 00000000<BR>c0001fa0: 00000000 00000000 00000000
00000000<BR>c0001fb0: 00000000 00000000 00000000 00000000<BR>c0001fc0:
00000000 00000000 00000000 00000000<BR>c0001fd0: 00000000 00000000
00000000 00000000<BR>c0001fe0: 00000000 00000000 00000000
00000000<BR>c0001ff0: 00000000 00000000 00000000
00000000<BR><BR>分析一下这个页表,一个页表负责4MB地址空间。每个有效项表明该页被映射到了物理页。从这个页表中看到,有大量的项是没有物理页映射的。这4MB地址空间,只有一部分映射了物理内存。<BR><BR><BR><B>地址空间中的
Large Page 部分</B></FONT></P>
<P><FONT face=宋体>
在页目录中我们可以看到从0xC0300800到0xC03009FC这128个页目录项的低12位值为0x1e3,也就是 111100011
。这些项的第7位, LargePage标志位,为1,表明这128个页目录项所指的是128个4M页。这128项所对应的虚拟地址空间
0x80000000 - 0x9FFFFFFF,大小0x20000000 Bytes = 512 M
Bytes。<BR><BR> 对于 x86 CPU 来说,要支持同时处理4K页目录项和4M页目录项,需要
寄存器CR4中的PSE标志为1,寄存器CR4的第4位是PSE标志。观察Win2k发现寄存器CR4中的PSE标志值为1,表明了Win2k的可以同时混用4M页和4K页。<BR><BR>kd>
r cr4<BR>r cr4<BR>cr4=000002d1<BR><BR>
对于4M的页目录项来说,它的第22bit到第31bit,这高10bit指明一个4M页的物理地址,第12bit到第21bit这10bit必须为0。最低12bit仍然是那些标志。对于4K的页目录项,它所指的物理页中放着一个页表。而对于4M的页目录项,它所指的物理页是直接用来放代码和数据的。也就是说该项不再需要页表了。CPU进行虚拟地址到物理地址的转换时,使用高10bit作为在页目录中的索引,找到页目录项,发现页目录项的
Large Page
标志位被设置的话,就直接取出该项中的物理地址,然后用虚拟地址的低22bit作为页内偏移,得到物理地址。<BR><BR>
系统的核心模组一般比较大,而系统的核心模组会经常使用,所以他们的页表项放在TLB(Translation Look-Aside
Buffer)高速缓存中比较好,如果使用4K页,需要多个4K页,也就需要占用比较多的TLB高速缓存。TLB高速缓存是非常宝贵的资源,如果使用4M页的话,那么就可以节省很多TLB高速缓存。<BR><BR>
实际中Win2k的两个最重要的核心模组 hal.dll 和 ntoskrnl.exe
被放在这片4M页的地址空间中。<BR><BR> 观察这128个页目录项中的物理地址,就会发现 地址空间
80000000 - 9FFFFFFF 将和物理内存 00000000 - 1FFFFFFF
一一映射。比如我有128M物理内存,他们将全部映射在这个地址空间中。从有效标志位来看,这128个页目录项,都是有效的。而且实际上他们总是有效的。他们对应512M的地址空间。如果只有128M的物理内存的话,明显很大一部分实际上不会有物理内存映射的。没有物理内存映射,而页目录项指示有效,那么读这些地址的内存,将会怎样?结果是不会蓝屏,读会成功完成,读出来的所有内容都是FF。<BR><BR>
如果这128个页目录项不是4M的页目录项,而是4K的页目录项的话,将会对应128个页表。那么现在这128个页表,从C0200000开始的128个页表,也就是
C0200000 - C027FFFF 这 512K
的地址空间是什么内容呢?观察结果是他们这128页中,映射了和128个页目录项对应4M地址空间的第一个4K相同的内容。比如,地址C0200000的这4K和地址80000000的4K内容是一样的,都是物理地址为00000000的4K。地址C0201000的这4K和地址80400000的4K内容是一样的,都是物理地址为00400000的4K。<BR><BR>
关于80000000-9FFFFFFF 将和物理内存 00000000-1FFFFFFF
一一映射。而且这128个页目录项总是有效的。<BR> 我们也可以在
ntoskrnl!MmGetPhysicalAddress
函数中找到证据。MmGetPhysicalAddress,将指定的虚拟地址转换成物理地址,参数介绍可以看ddk。这是个很简单的函数,用SoftICE在这个函数上下断点,然后自己写个驱动程序,用不同范围的虚拟地址触发这个函数。用SoftICE跟一遍这个函数的执行过程。就会发现对于在80000000-9FFFFFFF
中的地址,根本没做有效性检查,说明了他们总是有效的。而虚拟地址到物理地址的转换方法说明了和物理内存 00000000-1FFFFFFF
一一映射。其实计算在这个范围之内的虚拟地址对应的物理地址,只需要用虚拟地址减去0x80000000。<BR><BR>下面是使用 kd 反汇编函数
MmGetPhysicalAddress 得到的输出<BR>u MmGetPhysicalAddress l
30<BR>ntoskrnl!MmGetPhysicalAddress:<BR>804374e0 56 push esi<BR>804374e1
8b742408 mov esi,[esp+0x8]<BR>804374e5 33d2 xor edx,edx<BR>804374e7
81fe00000080 cmp esi,0x80000000<BR>804374ed 722c jb
ntoskrnl!MmGetPhysicalAddress+0x2b (8043751b)<BR>804374ef 81fe000000a0 cmp
esi,0xa0000000<BR>804374f5 7324 jnb ntoskrnl!MmGetPhysicalAddress+0x2b
(8043751b)<BR>804374f7 39153ce74780 cmp [ntoskrnl!MmKseg2Frame
(8047e73c)],edx<BR>804374fd 741c jz ntoskrnl!MmGetPhysicalAddress+0x2b
(8043751b)<BR>804374ff 8bc6 mov eax,esi<BR>80437501 c1e80c shr
eax,0xc<BR>80437504 25ffff0100 and eax,0x1ffff<BR>80437509 6a0c push
0xc<BR>8043750b 59 pop ecx<BR>8043750c e8d3a7fcff call ntoskrnl!_allshl
(80401ce4)<BR>80437511 81e6ff0f0000 and esi,0xfff<BR>80437517 03c6 add
eax,esi<BR>80437519 eb17 jmp ntoskrnl!MmGetPhysicalAddress+0x57
(80437532)<BR>8043751b 8bc6 mov eax,esi<BR>8043751d c1e80a shr
eax,0xa<BR>80437520 25fcff3f00 and eax,0x3ffffc<BR>80437525 2d00000040 sub
eax,0x40000000<BR>8043752a 8b00 mov eax,[eax]<BR>8043752c a801 test
al,0x1<BR>8043752e 7506 jnz ntoskrnl!MmGetPhysicalAddress+0x44
(80437536)<BR>80437530 33c0 xor eax,eax<BR>80437532 5e pop esi<BR>80437533
c20400 ret 0x4<BR>80437536 c1e80c shr eax,0xc<BR>80437539 ebce jmp
ntoskrnl!MmGetPhysicalAddress+0x47 (80437509)<BR>8043753b cc int
3<BR><BR>欢迎交流,欢迎交朋友,<BR>欢迎访问 <A
href="http://jiurl.yeah.net/">http://jiurl.yeah.net/</A> <A
href="http://jiurl.cosoft.org.cn/forum">http://jiurl.cosoft.org.cn/forum</A>
</FONT></P>
<P><FONT face=宋体><A
href="http://jiurl.cosoft.org.cn/jiurl/document/JiurlPlayWin2k/JiurlPdPtSee.zip">下载
JiurlPdPtSee 可执行文件及源程序</A>
</FONT></P></TD></TR></TBODY></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -