26
相信你已经对三段式分页掌握的非常熟练了。可是你有没有意识到,这种线性地址到物理地址的映射方式,存在着某种局限性?
它能够映射的最大的物理地址,也只能是 0xffffffff
. 原因在于,PTE 中的高20位保存的是页号,最大能保存的页号是 0xfffff
,每个页占用 4KB
,所以页号为 0xfffff
的物理页的物理偏移是 0xfffff000
.
每次说保存的是页号,其实有点烦了。因为把 PDE 或 PTE 最低 12 位抹 0 后,PDE 和 PTE 就变成物理基址了。所以今后我们直接说 PDE 、PTE 保存的就是物理基址。如此一来,PDE 、 PTE 占用 4 字节,能够索引的最大物理基址自然就是 4GB了。
如果你想插入一根 8GB 的内存条,岂不是有 4GB 都被浪费了?因为三段式分页根本就索引不到这根内存条的高 4GB 部分。
其实 cpu 硬件工程师们早就意识到了这个问题,他们设计了一种新的分页方式 —— PAE分页。
PAE 分页
三段式分页,是将线性地址拆分成了 10-10-12 的形式,而 PAE 分页,是将线性地址拆分成了 2-9-9-12 的四段式,即 3 段索引加偏移。其中的两个 9 分别是页目录表索引和页表索引。那么 2 是什么索引?不如,先看图1吧。
图1 四段式线性地址映射
2-9-9-12 分页方式转换方式:
- 根据 CR3 找到 Page Directory Pointer Table
- 根据一级索引在 Page Directory Pointer Table 中查询到 Page Directory
- 根据二级索引在 Page Directory 中查询到 Page Table
- 根据三级索引在 Page Table 中查询到普通 4KB 物理页
- 在物理页中查找第四段偏移。
根据以上描述,第一段索引其实就是 Page Directory Pointer Table(PDPT) 这张表的索引。
下面的彩图也许能帮助你理解。
图2 CR3-PDPT-PDT-PTT-物理页关系
为了能对照,我把三段式的 10-10-12图也搬过来。
图3 三段式分页
图2和图3区别就在于,PAE 分页又多了一级 PDPT。官方翻译为页目录指针表,为了便于理解,在此将其称为顶级目录表。这个表中,每个表项称为 PDPTE,也就是页目录指针表项,它保存的是页目录的基址。
三段式分页中的 PDE 和 PTE 都是 4 字节,无论是 PDT 还是 PTT 都有1024个表项。
而PAE分页中,PDPT只有 4 个表项,PDT 和 PTT 有 512 个表项,PDPTE、PDE、PTE 的大小是 8 字节。
PDPT 表一共占用 32 字节,PDT 、PTT 表仍然占用 4KB 的物理页。
回到篇首的问题,PAE 是如何把线性地址映射到了 4GB 以外的物理页上去的?那么需要研究一下 PTE 的结构。
PTE 结构
图4 PTE 结构
如果你还记得10-10-12的PTE,那么你对PAE分页一定不会陌生。低12位仍然是属性,唯一的区别就是,Page Base Address 由原来的 20 位变成了现在的 24 位,相对以前扩展了 4 位。
注意从 36-63 位这28位是保留位,不可用的。
这意味着,PTE 可以索引到的物理页页号由原来的 220" role="presentation" style="position: relative;">220220 变成现在的 224" role="presentation" style="position: relative;">224224,同样的,一个物理页大小是 4KB,那么PTE可以索引到的最大物理地址将会达到 224×212=64GB" role="presentation" style="position: relative;">224×212=64GB224×212=64GB。
其实,PAE 所做的事情,只是把线性地址的 4GB 虚拟空间打散到了物理地址的64 GB 空间中。这要怎么理解?看起来,应该像图5这样。
图5 PAE 分页与三段式分页对比。
图5中,不同颜色代表一个 4 KB 页(图中当然不可能画出太多的页,只是做演示)。可以看到,PAE分页的优势在于,它可以利用更大范围的物理地址。然而,能够映射的物理页总数还是不变(仍然只能使用 64GB 空间中的 4 个区域)。
PDE 和 PDPT 结构
图6 PDPT 结构
和三段式分页不同的是,PAE 分页多了一个 PDPT 表,也就是顶级目录表,它主要用来查找页目录的基址。因为 2-9-9-12 分页第一段索引只占用 2bit,所以最多可以索引 4 个页目录表。
图7 PDE 结构
基本上除了物理基址的位数增加了 4 bit 外,其它都和 10-10-12 分页没有什么变化。
总结
本篇主要介绍了PAE分页的原理,需要掌握的是 PDPT 顶级目录表的概念,它保存的是页目录的物理基址。
我知道你已经迫不急待的想试试了。之前我们使用的默认都是10-10-12分页模式。如何改成PAE分页模式呢?我们把时光倒流到第 0 篇《环境配置》那一篇,记得下面这张图吗?
你需要做的只是把红色框框里的参数 /execute=optin
改成 /noexecute=optin
就可以了。保存后重新启动你的虚拟机,就可以做 PAE 分页的实验啦。
图8 配置操作系统使用 PAE 分页
这里相当于留了一个小练习,小伙伴们,动起手来吧~!