windows内核(3)——PAE分页(2-9-9-12分页)
来学一下2-9-9-12分页,也叫PAE分页
为什么要有2-9-9-12分页
这一定一定是最会疑惑的一个问题,为什么要多拆一个 2 出来呢?回答:扩展物理内存。
我们都知道,32位的系统最大只能装 4GB 的内存,多了它用不上,然而这个说法比较片面,实则它可以装更多的内存,在 10-10-12 分页的模式中,我们知道,物理地址就是 32 位的,而物理地址位宽决定了物理内存最大的限度。
那么 2-9-9-12 分页事实上就做到了这一点,它将物理地址扩展到了 64 位的模式,并赋予一些位特殊的意义。既然物理地址变成了 64 位,PDE 和 PTE 自然也变成了 64 位,那么原来一个页就装不下 1024 个 PDE 或者 PTE 了,而只能装 512 个,这就是中间两个 9 的来源。而我们只扩展了物理地址,没有扩展虚拟地址,因此虚拟内存(单个进程持有的线性地址)最大还是只有 4GB。 所以前面再多个 2 去满足 32 位。
2-9-9-12分页简介
看完上一节之后大概能对 2-9-9-12 分页有个结构了,如下图所示:
多了一层名为页目录指针表(PDPTE)的东西,同样也是 64 位的大小,它的结构如下图所示:
它只使用了高四个字节的四位,但是为了对齐它填充到了 8 个字节,因此物理页地址被扩展到了 36 位,物理可用的内存达到了 64GB。
如果一个进程挂满物理页的情况下,在 10-10-12 分页模式下只能运行一个,但是在 2-9-9-12 分页模式下可以运行 16 个。
剩下的 PDE 和 PTE 扩展结构同理。
再有一点需要说的是,我们的页属性只有读和写两种,但是在三环的内存中,似乎还有可执行这个位,那么这个位在哪呢,实际上它将这个位填到了高位,也就是说 PTE,PDE,PDPTE这些大致结构应该如下图所示:
这是硬件层面上做的保护,一旦尝试执行的物理页中对应的 PTE 和 PDE 和 PDPTE 被置为 1,说明该页的数据不可以被执行,CPU尝试执行的时候会直接报出异常。
2-9-9-12分页实践
同样拿记事本和 CE 来做实验。
得到线性地址 0x00264EE8
,拆分
1 | 00000000001001100100111011101000 |
一样的流程找到对应的物理页
于此同时可以发现,在PTE条目中,最高位被置为 1,表示该数据是不执行的。