⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jiurl玩玩win2k内存篇 分页机制 (二).htm

📁 关于win2000核心编程的文章
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      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=宋体>&nbsp;&nbsp;&nbsp; 
      在页目录中我们可以看到从0xC0300800到0xC03009FC这128个页目录项的低12位值为0x1e3,也就是 111100011 
      。这些项的第7位, LargePage标志位,为1,表明这128个页目录项所指的是128个4M页。这128项所对应的虚拟地址空间 
      0x80000000 - 0x9FFFFFFF,大小0x20000000 Bytes = 512 M 
      Bytes。<BR><BR>&nbsp;&nbsp;&nbsp; 对于 x86 CPU 来说,要支持同时处理4K页目录项和4M页目录项,需要 
      寄存器CR4中的PSE标志为1,寄存器CR4的第4位是PSE标志。观察Win2k发现寄存器CR4中的PSE标志值为1,表明了Win2k的可以同时混用4M页和4K页。<BR><BR>kd&gt; 
      r cr4<BR>r cr4<BR>cr4=000002d1<BR><BR>&nbsp;&nbsp;&nbsp; 
      对于4M的页目录项来说,它的第22bit到第31bit,这高10bit指明一个4M页的物理地址,第12bit到第21bit这10bit必须为0。最低12bit仍然是那些标志。对于4K的页目录项,它所指的物理页中放着一个页表。而对于4M的页目录项,它所指的物理页是直接用来放代码和数据的。也就是说该项不再需要页表了。CPU进行虚拟地址到物理地址的转换时,使用高10bit作为在页目录中的索引,找到页目录项,发现页目录项的 
      Large Page 
      标志位被设置的话,就直接取出该项中的物理地址,然后用虚拟地址的低22bit作为页内偏移,得到物理地址。<BR><BR>&nbsp;&nbsp;&nbsp; 
      系统的核心模组一般比较大,而系统的核心模组会经常使用,所以他们的页表项放在TLB(Translation Look-Aside 
      Buffer)高速缓存中比较好,如果使用4K页,需要多个4K页,也就需要占用比较多的TLB高速缓存。TLB高速缓存是非常宝贵的资源,如果使用4M页的话,那么就可以节省很多TLB高速缓存。<BR><BR>&nbsp;&nbsp;&nbsp; 
      实际中Win2k的两个最重要的核心模组 hal.dll 和 ntoskrnl.exe 
      被放在这片4M页的地址空间中。<BR><BR>&nbsp;&nbsp;&nbsp; 观察这128个页目录项中的物理地址,就会发现 地址空间 
      80000000 - 9FFFFFFF 将和物理内存 00000000 - 1FFFFFFF 
      一一映射。比如我有128M物理内存,他们将全部映射在这个地址空间中。从有效标志位来看,这128个页目录项,都是有效的。而且实际上他们总是有效的。他们对应512M的地址空间。如果只有128M的物理内存的话,明显很大一部分实际上不会有物理内存映射的。没有物理内存映射,而页目录项指示有效,那么读这些地址的内存,将会怎样?结果是不会蓝屏,读会成功完成,读出来的所有内容都是FF。<BR><BR>&nbsp;&nbsp;&nbsp; 
      如果这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>&nbsp;&nbsp;&nbsp; 
      关于80000000-9FFFFFFF 将和物理内存 00000000-1FFFFFFF 
      一一映射。而且这128个页目录项总是有效的。<BR>&nbsp;&nbsp;&nbsp; 我们也可以在 
      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 + -