首页 > 其他 > 详细

10-10-12分页机制(xp)

时间:2021-03-04 12:09:14      阅读:36      评论:0      收藏:0      [点我收藏+]

虚拟地址到物理地址

虚拟地址空间就是32位系统的那4GB,这4GB空间的地址称为虚拟地址。虚拟地址经过分段机制后转化为线性地址,一般虚拟地址都等于线性地址,因为大多数段寄存器的基地址都为0,只有FS段寄存器的基地址不会0。线性地址经过分页机制最终映射到物理地址上。

技术分享图片

页目录表,页表

页目录表实际是特殊的页表,普通的页表的页表项都指向物理页,而页目录表的页目录项指向的是其他页表。

技术分享图片

CR3寄存器中前20位存储的是页目录表的物理基地址,

技术分享图片

页目录表项PDE前20位存取的是页表的物理基地址,而后12位为属性。其P/S位如果为1表示物理页大小为4MB(大页)也就没有页表了,如果为0表示物理页大小为4kB。

技术分享图片

页目录表项PDE的第0位为有效位,第1位为R/W读写位(0只读,1可读可写),U/S位为权限位(0特权用户可以访问,1普通用户可以访问):例如一些高2Gb地址空间的地址在用户层不能访问就是因为此地址空间中地址对应的P/S位为0。A位为访问位表示是否被访问过,D位为写位表示是否被写过。

以上这些属性页表项也有,而且对应物理地址的最终属性为PDE的属性与上PTE的属性。

技术分享图片

10-10-12分页

10-10-12分页的意思是将32位线性地址拆分成10位-10位-12位。
第一个10位为页目录表的索引,第二个10位为页表的索引,第三个12位为物理页中的偏移地址。这是对物理页为4kb的而言,也就是说页目录表项的PDE的PS位为0。当ps位为1 时表示使用的是4MB的物理内存页,那么线性地址的第2个10位和第三个12位组成物理地址的低22位,其他28位在页目录项PDE中存储。

页目录表基地址,页表基地址

页目录表的线性基地址为0xC0300000,而页表的线性基地址为0xC0000000。因为页目录表就是页表而且其表大小都是2的10次方(0x1000个字节),所以页目录表实际是第0x300个页表。0xC0300000线性基地址指向的物理地址就是CR3指向的物理地址。

//PDI为线性地址的第一个10位,PTI为线性地址的第二个10位
0xC0300000 + PDI * 4               //访问页目录表

0xC0000000 + PDI * 4096 + PTI * 4  //访问页表

读写0地址

如果直接读写0地址会出错,我们可以查看一下线性地址0x00000000对应的物理地址。CR3为0x16f5a000,查看其PTE为0说明并没有为0地址挂物理页所以不能读写此地址。

技术分享图片
技术分享图片

我们要想读写0地址就要为其挂上物理页,我们可以利用VirtualAlloc申请虚拟内存,然后将此虚拟内存对应的物理页挂到0地址处。假设VirtualAlloc申请的虚拟内存地址为0x003F0000,我们查看其PDE与PTE。

技术分享图片

技术分享图片

0线性地址的PDE与0x003f0000地址的PDE相等,我们将0x003f0000的PTE写到0地址的PTE地址处,这样就为其挂上了物理页。

技术分享图片

这时我们在读写0地址都不会出错,因为其已经分配了物理页。我们还可以在应用程序中提权后,根据页目录表基地址0xC0300000和页表基地址0xC0000000找到任意虚拟地址的PDE和PTE从而控制他们的属性。

10-10-12分页机制(xp)

原文:https://www.cnblogs.com/revercc/p/14479329.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!