26-PAE 分页
2016-10-19 10:18
169 查看
相信你已经对三段式分页掌握的非常熟练了。可是你有没有意识到,这种线性地址到物理地址的映射方式,存在着某种局限性?
它能够映射的最大的物理地址,也只能是
每次说保存的是页号,其实有点烦了。因为把 PDE 或 PTE 最低 12 位抹 0 后,PDE 和 PTE 就变成物理基址了。所以今后我们直接说 PDE 、PTE 保存的就是物理基址。如此一来,PDE 、 PTE 占用 4 字节,能够索引的最大物理基址自然就是 4GB了。
如果你想插入一根 8GB 的内存条,岂不是有 4GB 都被浪费了?因为三段式分页根本就索引不到这根内存条的高 4GB 部分。
其实 cpu 硬件工程师们早就意识到了这个问题,他们设计了一种新的分页方式 —— PAE分页。
![](http://img.blog.csdn.net/20161016121944793)
图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) 这张表的索引。
下面的彩图也许能帮助你理解。
![](http://img.blog.csdn.net/20161016111438858)
图2 CR3-PDPT-PDT-PTT-物理页关系
为了能对照,我把三段式的 10-10-12图也搬过来。
![](http://img.blog.csdn.net/20161016112529318)
图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 的结构。
![](http://img.blog.csdn.net/20161017204134023)
图4 PTE 结构
如果你还记得10-10-12的PTE,那么你对PAE分页一定不会陌生。低12位仍然是属性,唯一的区别就是,Page Base Address 由原来的 20 位变成了现在的 24 位,相对以前扩展了 4 位。
注意从 36-63 位这28位是保留位,不可用的。
这意味着,PTE 可以索引到的物理页页号由原来的 220 变成现在的 224,同样的,一个物理页大小是 4KB,那么PTE可以索引到的最大物理地址将会达到 224×212=64GB。
其实,PAE 所做的事情,只是把线性地址的 4GB 虚拟空间打散到了物理地址的64 GB 空间中。这要怎么理解?看起来,应该像图5这样。
![](http://img.blog.csdn.net/20161019095412602)
图5 PAE 分页与三段式分页对比。
图5中,不同颜色代表一个 4 KB 页(图中当然不可能画出太多的页,只是做演示)。可以看到,PAE分页的优势在于,它可以利用更大范围的物理地址。然而,能够映射的物理页总数还是不变(仍然只能使用 64GB 空间中的 4 个区域)。
![](http://img.blog.csdn.net/20161019095649706)
图6 PDPT 结构
和三段式分页不同的是,PAE 分页多了一个 PDPT 表,也就是顶级目录表,它主要用来查找页目录的基址。因为 2-9-9-12 分页第一段索引只占用 2bit,所以最多可以索引 4 个页目录表。
![](http://img.blog.csdn.net/20161019095608955)
图7 PDE 结构
基本上除了物理基址的位数增加了 4 bit 外,其它都和 10-10-12 分页没有什么变化。
我知道你已经迫不急待的想试试了。之前我们使用的默认都是10-10-12分页模式。如何改成PAE分页模式呢?我们把时光倒流到第 0 篇《环境配置》那一篇,记得下面这张图吗?
你需要做的只是把红色框框里的参数
![](http://img.blog.csdn.net/20160930105536251)
图8 配置操作系统使用 PAE 分页
这里相当于留了一个小练习,小伙伴们,动起手来吧~!
它能够映射的最大的物理地址,也只能是
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 变成现在的 224,同样的,一个物理页大小是 4KB,那么PTE可以索引到的最大物理地址将会达到 224×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 分页
这里相当于留了一个小练习,小伙伴们,动起手来吧~!
相关文章推荐
- 使用WinDBG分析启用PAE后的分页机制
- 夺命雷公狗ThinkPHP项目之----企业网站26之网站前台列表页的显示和完成分页功能
- 物理地址扩展(PAE)分页机制 .
- 使用WinDBG观察启用PAE后的分页机制
- 物理地址扩展(PAE)分页机制
- 28-PAE分页下的PDT-PTT基址
- 使用WinDBG观察启用PAE后的分页机制
- 32位ubuntu物理地址扩展(PAE)分页机制及如何开启PAE支持4G以上内存(有时grub里面会让你选择)
- 使用WinDBG观察启用PAE后的分页机制
- 内存分页之PAE分页模式
- 使用WinDBG观察分页机制 ---- 实验前提(关闭PAE(物理地址扩展))
- 物理地址扩展(PAE)分页机制
- 内存管理:物理地址扩展(PAE)分页机制
- 使用windbg观察IA-32处理器启用PAE后内存分页映射关系
- 连接mysql的javabean实例+简单分页
- php 结果集的分页实现代码
- 仿谷歌搜索中的分页
- jsp 分页 oracle数据库
- 分页显示二
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询