内核-分页

本文详细介绍了操作系统的内存管理机制,特别是32位CPU的分页过程。通过10-10-12的分页方式,解释了如何将线性地址转换为物理地址,涉及PDE、PTE等概念,并探讨了PAE(物理地址扩展)在应对4GB内存限制时的作用。文章还展示了如何使用Windbg工具来查看和分析进程的CR3寄存器,以及如何进行地址转换来访问数据。
摘要由CSDN通过智能技术生成

每个进程拥有4G的空间是假的 不是真实存在的 当你使用某个空间的时候 操作系统会把你的数据存储到物理内存中

  1. 物理地址

指令

Mov eax,dword ptr ds:[0x12345678]

其中 0x12345678是有效地址

Ds.base+0x12345678是线性地址

通常情况下 有效地址 == 线性地址 因为ds.base是0

 当cpu执行如上指令的时候  会把线性地址转换成物理地址

32位cpu 10 10 12 分页

 

从2 9 9 12 转换成10 10 12  cmd运行

BCDEdit /set PAE ForceDisable

BCDEdit /set NX  AlwaysOff

在重启电脑

 

测试程序

拖到虚拟机里运行 此地址为线性地址 需转换成物理地址

 

0x010b7b30  拆分成10-10-12这种形式

页目录表索引(第一级):00 0000 0100

页表索引(第二级):00 1011 0111   

页索引(物理页):1011 0011 0000

Cr3寄存器 是唯一一个存储了物理地址的寄存器

 

找哪个进程的物理地址 就要找哪个进程的CR3 我们使用windbg 加载 符号之后,通过!process命令能够查看进程得信息 DirBase就是cr3的地址

查看此时的cr3还是系统进程的 需要切换到我们的进程

 

.process /i 86761d40  可以将当前的环境切换到这个进程

切换进来之后,才能够看到这个地址中的数据。

 

 此时的cr3才是我们进程的cr3

 

页目录表索引(第一级):0000000100(4)   

页表索引(第二级):00 1011 0111(b7)   

页索引(物理页):1011 0011 0000(b30)

查看页目录表 查找第四项 公式48c49000(数组首地址) + 4(下标)*4(类型)

而0x4863a867 的前20位才是页目录项地址偏移 也就是0x4863a000

0x4863a000+b7*4也就找到了物理页的偏移的地址

0x5b30b025前20位 0x5b30b000 + b30

 

 

 

Cr3指向页目录表(PDT) 大小为4096(4kb)个字节 每个成员是4字节 也就是说有1024个成员这1024个成员叫PDE 他又指向页表(PTT)大小也是4096(4kb)个字节 也有1024个成员 每个成员叫PTE 他又指向一个物理页 大小也是4096(4kb)字节 才是真正存储数据的

为什么虚拟地址要分成10-10-12????

是因为页目录表和页表大小为4kb(4096字节) 1024个成员 需要2的10次方二进制位才能表示(因为有下标即可) 物理页4096大小则需要2的12次方

  1. PTE可以没有物理页,且只能对应一个物理页
  2. 多个PTE页可指向同一个物理页

PDE 和 PTE的属性

物理页的属性=PDE属性PTE属性

 

 

P位:是否有效位
注意:当PDE或PTE中有一个的属性P=0时,物理页就是无效的

R/W位:读写位
R/W=0:只读
R/W=1:可读可写

U/S位:权限位

U/S=0:特权用户

U/S=1:普通用户

PS位:PDE特有

PS == PageSize

PS=1:PDE直接指向物理页,低22位=页内偏移,偏移最大值为4MB,俗称"大页"

PS=0:PDE指向PTE

A位:访问位

A=1:该PDE/PTE被访问过

A=0:该PDE/PTE未被访问过

D 位 – 是否被写入,CPU 会在写入页面时将该位置 1,但不会清除,只有软件可以将 D 位复位

PWT – 页表缓冲写入机制,为 0 表示 write-back 模式,更新页表缓冲区时,只标记为已更新,不同步写内存,只有被新进入的数据取代时才更新到内存,为 1 表示 write-through 模式,更新页表缓冲区时,同步写内存,保证缓冲区与内存一致

32位cpu 2 9 9 12 分页

10-10-12分页方式物理地址最多可达4GB,无法满足要求,所以设计了新的分页方式也就是2-9-9-12分页方式 又称PAE(物理地址扩展)分页

 

 

10-10-12 改为 2-9-9-12

BCDEdit /set PAE ForceEnable

BCDEdit /set NX  AlwaysOn

PDPTE

结构图:

 

P位:第0位,有效位 永远为1

Avail:这部分供操作系统软件随意使用,CPU不使用

第一部分:高四字节32~35位
第二部分:低4字节12~31位
这两部分加起来共24位,后12位补0

灰色部分:保留位

PDE

结构图:

 

PAT位:页属性表
只有当PS=1时,PAT位才是有意义的(页属性表只针对页)
具体含义这里不作介绍,感兴趣的同学可以查阅资料

PTE

结构图:

 

注意:

  1. PTE中12~35位是物理页基址,低12位补0
  2. 物理页基址+12位页内偏移指向具体数据

找到字符串

A17BD8 拆分二进制

00   0 0000 0101   0 0001 0111     1011 1101 1000

PDPTE:0

PDE:5

PTE:17

物理页:BD8

使用!process 0 0遍历进程

 指令 .process /i 0x87d0f030切换到我们的进程 直接运行 再查看cr3是否相等

 通过指令!dq cr3+8*0查看PDPTE

 

通过指令!dq 5ed38000+8*5查看PDE

通过指令!db 45cfc000+BD8查看物理页

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值