欢迎来到天天文库
浏览记录
ID:18154227
大小:757.00 KB
页数:125页
时间:2018-09-14
《windows操作系统原理深入探索分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1.小议WindowsNT/2000分页机制 WebCrazy(tsu00@263.net) 内存管理是操作系统最重要的一部分,其决定了操作系统的性能。IntelX86采用分段、分页的内存机制,WindowsNT/2000充分利用了此项先进的机制。段内IA-32体系使用页目录(PageDirectory)与页表(PageTable,SoftICE中Page命令可以显示出页目录与页表等)形成对4G地址的寻址能力。文中未特别说明,均讨论运行平台为Intel32位处理器的W
2、indowsNT/2000,所提及的Windows也仅指WindowsNT/2000。Windows中不管用户态与核心态的代码段、数据段与堆栈段基址均为0,文中提到的逻辑地址(由段基址与偏移量两部分组成)与线性地址值是相等的。由于对于用户来说线性地址是其可见的,若我未特别指出物理地址,所说的地址也仅指线性地址。 页目录(PDE)由1024项组成,每项均指向一页表(PTE),每一页表也由1024个页组成,IA-32体系每页大小为4K,所以可寻址范围为4G(1024*1024*4K)。Windows中每个进程
3、都拥有其各自的进程地址空间,即拥有其各自的页目录与页表。每个进程均使用线性地址C0300000H指向其特定的页目录所在的地址,而页目录中每项(即页表)均依次排列在线性地址C0000000H处,每个页表均占用4K(1024*4)字节,如第一个页表位于C0000000H处,而第二个页表位于C0000000+1000H(4K),即C0001000中,依次类推,计算公式即为C0000000H+页目录偏移值(线性地址的高10位)*1000H,在下面我将利用此公式。当然以上描述的前提是每个页表均位于物理内存中(由页目录中
4、每项中的P位指定),这也是为什么IA-32使用两级页表的原因,否则每个进程除其代码与数据等外还额外需要4M(4*1024*1024)的存储器。 上面的机制即实现了物理地址寻址,也就实现了在WindowsNT/2000中物理地址与线性地址的相互转换(虽然CPU在对内存操作时只需要线性地址转换成物理地址,但我们在分析程序代码等仍需要物理地址转换成线性地址)。照例先看看SoftICE的分析吧: //addrexplorer命令后以下操作将只在进程explorer的私有进程空间进行 :addrexplor
5、er //显示explorer进程页目录所在物理地址,即进程切换至explorer后PDBR(CR3)中的值 :addr CR3 LDTBase:LimitKPEBAddrPID Name . . . 00C10000 FF9FC920 036Cexplorer . . . /* 线性地址的格式:0-11位对应1页(4096字节
6、)的偏移量 12-21位对当前页表中1024项中寻址 22-31位对页目录进行寻址 高20位(12-31位)又称为桢 根据上面提及的公式,即可以得到物理地址高20位的值,再加上线性地址页表偏移(作为物理 地址的低12位),即实现了线性地址转化为物理地址,用公式表示为: @(C0000000h+PDE*1000h+PTE*4)&0fffff000h+PO =@(C0000000h+4*(PDE*400h+PTE))&0ffff
7、f000h+PO =@(C0000000h+(PDE>>10d+PTE)<<2d)&0fffff000h+PO =@(C0000000h+(LA>>12d)<<2d)&0fffff000h+PO =@(C0000000h+(LA&0xFFFFF000)>>10d)&0fffff000h+PO 上式中用PDE与PTE分别代表PageDirectory与PageTable的偏移值,用LA代表给定的线性 地址,用PO代表LA的低12位,用h与d分别
8、代表16/10进制,@后表示取后地址指针中的内容。 如此分析后,线性地址C0300000所对应的页目录为300h,页表为300h,偏移量为0 则C0000000h+PD*1000h+PT*4+PO=C0000000+300h*1000h+300h*4+0 */ :ddc0000000+300*1000+300*4l4 0010:C0300C0000C1006301
此文档下载收益归作者所有