首页
社区
课程
招聘
[旧帖] [原创]前几天学习分页时做的笔记,分享给需要的朋友 申请转正 0.00雪花
发表于: 2014-11-23 21:50 1720

[旧帖] [原创]前几天学习分页时做的笔记,分享给需要的朋友 申请转正 0.00雪花

2014-11-23 21:50
1720
前几天学习分页时做的笔记,分享给需要与共同学习进步的的朋友们,弱弱的说一声 哪位大大给个邀请码,求转正

=======================================================================

分页机制学习笔记
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直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark
2014-11-24 09:25
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
木有人咩0.0 还是。。。
2014-11-24 15:09
0
雪    币: 768
活跃值: (530)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
4
不错,,,当时学习内存管理知识时,有这样的教程就轻松多了。
2014-11-24 15:26
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢大哥鼓励~
2014-11-24 15:41
0
游客
登录 | 注册 方可回帖
返回
//