前几天学习分页时做的笔记,分享给需要与共同学习进步的的朋友们,弱弱的说一声 哪位大大给个邀请码,求转正
=======================================================================
分页机制学习笔记
PAE模式
什么是PAE模式:PAE,物理地址扩展,是基于x86 的服务器的一种功能,它使运行 Windows Server 2003, Enterprise Edition 和 Windows Server 2003,Datacenter Edition 的计算机可以支持4GB 以上物理内存。物理地址扩展 (PAE) 允许将最多64GB 的物理内存用作常规的4 KB 页面,并扩展内核能使用的位数以将物理内存地址从32扩展到36。
如何开启关闭PAE:Win7 开启: 在cmd中输入: bcdedit /set pae forceenable
Win7 关闭:bcdedit /set pae forcedisable
XP 开启:C:\boot.ini 加上 /noexecute=optin /fastdetect /PAE
XP 关闭:C:\boot.ini 将 /noexecute=optin /fastdetect /PAE 改为 /execute /NOPAE
寄存器:与分页管理机制有关的寄存器有CR0、CR3、CR4寄存器,通过INTEL手册的阅读可以发现
CR0 的第16位控制WP:
对于Intel 80486或以上的CPU,CR0的位16是写保护(Write Proctect)标志。当设置该标志时,处理器会禁止超级用户程序(例如特权级0的程序)向用户级只读页面执行写操作;当该位复位时则反之。该标志有利于UNIX类操作系统在创建进程时实现写时复制(Copy on Write)技术。
CR0的第31位控制PG:
CR0的位31是分页(Paging)标志。当设置该位时即开启了分页机制;当复位时则禁止分页机制,此时所有线性地址等同于物理地址。在开启这个标志之前必须已经或者同时开启PE标志。即若要启用分页机制,那么PE和PG标志都要置位。
CR4 的第5位控制着PAE模式。
CR3用来存放最高级页目录地址(物理地址),各级页表项中存放的也是物理地址。
需要用到的术语:
分段机制:主要实现虚拟地址到线性地址的转换。
分页机制:主要实现线性地址到物理地址的转换。页的大小4K,每页都是边界都是4K的整数倍。
页码:因为分页起始地址是模4K,所以分页的开始地址都是 “XXXXX000H”的形式, XXXXX就是页码.
80386把页映射表分为两级:
第一级页表:页目录表(Page Directory Table),缩写:PDT. 大小:4K ,每项4字节,包含二级页表所在物理地址空间页的页码.存在:物理内存中(不能是虚拟机内存,如果是虚拟内存中,那么就递归查找了,不符合逻辑,所以存在于物理地址中)
第二级页表:页表(Page Table Table),缩写:PTT,大小:4K ,每项4字节,包含对应物理空间页的页码.
每个进程都有一个单独的页目录,微软将它存放在EPROCESS==>KPROCESS==>DirectoryTableBase[2]
(未开启PAE)与线性地址的对应关系:
(开启PAE)与线性地址的对应关系:
开启PAE后和未开启PAE后的变化:开启PAE后PDE共4*4kb,每项8bytes,未开启PAE只有4KB,每项4bytes.
(一)先来针对未开启PAE模式来进行分析
测试机器XP 32位系统:(Dbgview.exe程序的线性(虚拟)地址与物理地址的对应)
这里关闭了PAE模式。
我先用OD载入Dbgview.exe程序,并且运行,
看到程序入口点的线性(虚拟)地址:004153B7==> 00000000 01000001 01010011 10110111
根据INTEL手册中的定义:
进行分段:0000000001 0000010101 001110110111
PDE PTE 物理偏移
打开WindDbg,查看DebugView 中EPROCESS==>KPROCESS==>DirectoryTableBase[0]:
PDE:0000000001==》 1
值:13ddc067==》物理页面的起始地址:13ddc000
PTE:0000010101==》21
值080a3025==》物理页面起始地址:080a3000加上 物理偏移001110110111==》0x3B7
对比OD
机器码是一样的,说明物理内存地址找对了!
接下来修改一下物理内存~~ !eb 080A33B7 80将E8随便修改成80看看效果
嘿嘿,修改成功~~~表示地址对应无误!
(二)针对开启PAE模式来进行分析
测试机器Win7 32位系统:(Dbgview.exe程序的线性(虚拟)地址与物理地址的对应)
根据读INTEL手册可知,开启了PAE模式后线性(虚拟)地址的结构发生了变化(开启PAE后PDE共4*4kb,每项8byte ):
30~31位变成了PDPTE
首先在虚拟机中打开OD,加载Dbgview.exe记录下入口点地址:00415757
将线性(虚拟)地址转化为二进制后:00000000 01000001 01010111 01010111
根据INTEL手册进行分段:
00 000000010 000010101 011101010111
PDPTE PDE PTE 物理地址
打开WindDbg,查看DebugView 中EPROCESS==>KPROCESS==>DirectoryTableBase:
为0x7ed17600
PDPTE:00 ==》 0 ==》 5bc8e801 ==》 起始地址:5bc8e000
由于PDE:000000010 ==》 0x2 所以有:
403dc867 ==》 起始地址: 403dc000,
由于PTE :000010101 ==》 0x15 所以有:
3d7f2005 ==》 起始地址: 3d7f2000,
由于物理地址:011101010111 ==》 0x757
所以:
对比OD加载的虚拟机地址处的机器码:
一致!接下来修改物理地址:!eb 3d7f2757 80 执行完毕后查看OD~
对应的也修改了,说明找到物理地址是正确的!
Windows分页机制.doc
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课