2-9-9-12分页机制(xp/xp后的32位系统)

PAE

PAE(Physical Address Extension)为物理地址扩展,传统的10-10-12分页最多可以访问的物理内存为4GB无法满足需要,通过物理地址扩展增加PTB增加访问到物理地址的上限。Inter用MAXPHYADDR来表示能访问到的最大的物理地址位数,对于我们个人计算机而言为36位即64GB。

10-10-12分页限制

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

2-9-9-12分页

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

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

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

PDE的PS位如果为1,表示物理页大小为2^ 21 (9 + 12)= 2MB,PDE的35-21位(PFN物理页帧)为物理地址对应的高15位,低21位置0。
PDE的PS为如果为0,表示物理页大小为2^ 12 = 4kb,PDE的35-12位为PTT的物理地址。
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线性地址对应的物理地址等信息。

我们在windbg中将PDE和PTE的的U/S位设为1即可读取此高地址的内存

注意:一个PTT页表包含512个页表项而且每一个页表都指向4kb大小的物理页,一个PDT页目录表有512个页目录项所以共指向4kb*512 = 2Mb物理内存,一个PDPT页目录指针表有512个页目录指针项所以共指向2Mb*512 = 1GB物理内存,一共有4个PDPT页目录指针表所以一共能映射1GB*4=4GB虚拟地址空间,刚好和X86的虚拟地址空间匹配。(内核空间的系统页表PTE与用户空间的页表PTE都会保存在0xC0000000(PTE_BASE)地址处,一般PDT的前半部分为用户地址空间的PDE,后半部分为系统地址空间的PDE)

posted @ 2021-03-04 18:09  怎么可以吃突突  阅读(358)  评论(0编辑  收藏  举报