标签:分页机制 2gb 系统 查看 mic 技术 图片 代码执行 指针
10-10-12分页因为页表PEB只有四个字节所以只能访问2^32 = 4GB物理地址空间,现在的物理内存都大于4GB为了能访问到更多的物理内存2-9-9-12将PEB的大小增加到了8个字节,其中36位用来表示物理页基地址,这样就可以访问到2^36 = 64GB物理地址空间。因为一个物理页大小一般为4kb,为了增加页表中PEB的大小,所以页表长度就减小了(10减到9)。
线性地址的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就可以使此地址对应的数据无法执行。其他位都需要与一下。
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成功。
标签:分页机制 2gb 系统 查看 mic 技术 图片 代码执行 指针
原文地址:https://www.cnblogs.com/revercc/p/14482023.html