码迷,mamicode.com
首页 > 其他好文 > 详细

2-9-9-12分页机制(xp)

时间:2021-03-05 13:06:48      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:分页机制   2gb   系统   查看   mic   技术   图片   代码执行   指针   

10-10-12分页限制

10-10-12分页因为页表PEB只有四个字节所以只能访问2^32 = 4GB物理地址空间,现在的物理内存都大于4GB为了能访问到更多的物理内存2-9-9-12将PEB的大小增加到了8个字节,其中36位用来表示物理页基地址,这样就可以访问到2^36 = 64GB物理地址空间。因为一个物理页大小一般为4kb,为了增加页表中PEB的大小,所以页表长度就减小了(10减到9)。

2-9-9-12分页

线性地址的2是页目录指针表PDTPT的索引,9是页目录表PDT的索引,下一个9是页表PTT的索引,下一个12是页内偏移地址。

技术图片

PDTPT,PDT,PTT的每一项都是八个字节。CR3现在指向的是PDTPT页目录表指针表,0-4位忽略后0-31位表示PDTPT表物理基地址。

技术图片

PDTPE是页目录指针表项,其0位依然是P有效位,0-35位指向PDT页目录表(0-11位置0)。

技术图片

PDE的PS位如果为1,表示物理页大小为2^ 21 (9 + 12)= 2MB,最高位XD(NX)位为不可执行位,如果此位为1则此地址的数据不能作为代码执行。G位是全局位(此线性地址为高2GB地址)只有当其PS位为1时才有G位否则无G位,如果为1那么当CR3变化时,不会清除TLB表中此地址对应的项,提高效率。

技术图片

PTE也有XD不可执行位和G位全局位,注意只要PDE和PTE中其中一个的XD位为1就可以使此地址对应的数据无法执行。其他位都需要与一下。

技术图片

在3环读写高2GB地址内存

printf("0x%x", (*(DWORD*)0x8003f048));
(*(DWORD*)0x8003f048) = 0x12345678;
printf("0x%x", (*(DWORD*)0x8003f048));

我们在windbg中查看地址0x8003f048线性地址对应的物理地址等信息。

技术图片

我们将PDE和PTE的的U/S位设为1,但是发现0x8003f048地址仍然不能读写。原因是TLB缓存搞的鬼,因为PDE的ps位为0所以其G位无效,但是PTE的G位为1表示全局页,即当CR3切换时TLB表中对应的此地址的项并不会改变,而当我们读写0x8003F048时系统先访问TLB发现其属性U/S权限为0,所以不允许访问。

技术图片

我们在将PTE的G位设置为0,在执行程序读写0x8003F048成功。

2-9-9-12分页机制(xp)

标签:分页机制   2gb   系统   查看   mic   技术   图片   代码执行   指针   

原文地址:https://www.cnblogs.com/revercc/p/14482023.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!