来学一下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
2
3
4
5
6
7
8
9
10
00000000001001100100111011101000
按2-9-9-12拆开
00
0x0
000000001
0x1
001100100
0x64
111011101000
0xEE8

一样的流程找到对应的物理页

于此同时可以发现,在PTE条目中,最高位被置为 1,表示该数据是不执行的。

参考文献