Linux内核-内存管理-PAE(物理地址扩展)
2013-11-12 01:51
633 查看
原文出自:http://blog.csdn.net/trochiluses/article/details/12853027
Intel 通过在处理器上把管脚数从 32 增加到 36,以提高处理器的寻址能力,使其达到 2^36=64GB,然而线性地址的位数仍然是 32 位,为此,需引入一种新的分页机制。从pentium pro 处理器开始,intel引入一种叫做 PAE 的机制,Linux 中使用了这种机制。
64GB 的 RAM 被分为 2^24 个页框,页表项的物理地址字段从 20 位扩展到 24 位,每个页表项必须包含 12 个标志位(固定)和 24 个物理地址位(36-12,因为最多有 2^24 个页框可以被页表项指定),共 36 位,因此,每个页表项须从 32 位扩展到 64 位(36位>32位,考虑到对齐,因此应将页表项扩大一倍到64位)。
在4KB的常规分页情况下,由于每个页表项大小为64位,因而,原有4K大小的页表中,仅能包含512个表项,这占用了32位线性地址中的9位,同理,由于页目录项与页表项具有同样的结构,高一级的页目录表中也仅能包含512个页表项(目录项),同样占用了32位线性地址中的9位,此时,线性地址剩余位数为:32位(总位数)-12位(页内偏移量)-9位(指示页表中的索引)-9位(指示页目录表中的索引)=2位,同时,Linux引入了一个页目录指针表(PDPT)的页表新级别,由4个64位表项构成,剩余的2位即用来指向PDPT中4个项中的一个。
下面4张图详细说明了4种情况下的页表结构(引自Wikipedia)
【未启用PAE下的4K分页的页表结构】
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/06/da217446ea3afb5ea01f2d570a0207e2.gif)
【未启用PAE下的4M分页的页表结构】
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/06/dcfcf3a3ddefb88c931650f1fed1929e.gif)
【启用PAE下4K分页的页表结构】
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/06/a535cdc62be75477ba2599855cddf39d.gif)
【启用PAE下2M分页的页表结构】
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/06/f06ae5d9a5de60dc4b583eaccc2c65b8.gif)
线性地址的映射过程如下:
1)cr3:指向一个PDPT基地址
2)地址的31~30:确定PDPT项
3)地址的29~21:确定页目录项中的一个
此处,发生了分支:
A. 如果页目录项的PS标志位等于0,那么页大小是4K
4)地址的20~12:确定页表的某一项
5)地址的11~0:确定偏移
B. 如果PS=1,启用2M大页
4)地址的20~0:确定2M页中的偏移量。
Intel 通过在处理器上把管脚数从 32 增加到 36,以提高处理器的寻址能力,使其达到 2^36=64GB,然而线性地址的位数仍然是 32 位,为此,需引入一种新的分页机制。从pentium pro 处理器开始,intel引入一种叫做 PAE 的机制,Linux 中使用了这种机制。
64GB 的 RAM 被分为 2^24 个页框,页表项的物理地址字段从 20 位扩展到 24 位,每个页表项必须包含 12 个标志位(固定)和 24 个物理地址位(36-12,因为最多有 2^24 个页框可以被页表项指定),共 36 位,因此,每个页表项须从 32 位扩展到 64 位(36位>32位,考虑到对齐,因此应将页表项扩大一倍到64位)。
在4KB的常规分页情况下,由于每个页表项大小为64位,因而,原有4K大小的页表中,仅能包含512个表项,这占用了32位线性地址中的9位,同理,由于页目录项与页表项具有同样的结构,高一级的页目录表中也仅能包含512个页表项(目录项),同样占用了32位线性地址中的9位,此时,线性地址剩余位数为:32位(总位数)-12位(页内偏移量)-9位(指示页表中的索引)-9位(指示页目录表中的索引)=2位,同时,Linux引入了一个页目录指针表(PDPT)的页表新级别,由4个64位表项构成,剩余的2位即用来指向PDPT中4个项中的一个。
下面4张图详细说明了4种情况下的页表结构(引自Wikipedia)
【未启用PAE下的4K分页的页表结构】
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/06/da217446ea3afb5ea01f2d570a0207e2.gif)
【未启用PAE下的4M分页的页表结构】
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/06/dcfcf3a3ddefb88c931650f1fed1929e.gif)
【启用PAE下4K分页的页表结构】
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/06/a535cdc62be75477ba2599855cddf39d.gif)
【启用PAE下2M分页的页表结构】
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/06/f06ae5d9a5de60dc4b583eaccc2c65b8.gif)
线性地址的映射过程如下:
1)cr3:指向一个PDPT基地址
2)地址的31~30:确定PDPT项
3)地址的29~21:确定页目录项中的一个
此处,发生了分支:
A. 如果页目录项的PS标志位等于0,那么页大小是4K
4)地址的20~12:确定页表的某一项
5)地址的11~0:确定偏移
B. 如果PS=1,启用2M大页
4)地址的20~0:确定2M页中的偏移量。
相关文章推荐
- 深入探讨PHP中的内存管理问题
- linux 内存管理机制详细解析
- 解析PHP中的内存管理,PHP动态分配和释放内存
- javascript内存管理详细解析
- javascript错误的认识不用关心内存管理
- 简单说说STL的内存管理
- jemalloc优化MySQL、Nginx内存管理
- 【转】JVM内存管理:深入垃圾收集器与内存分配策略
- 戴文的Linux内核专题:01 介绍
- 戴文的Linux内核专题:02 源代码
- 戴文的Linux内核专题:03 驱动程序
- 戴文的Linux内核专题:04 安全
- 戴文的Linux内核专题:05 配置内核 (1)
- 戴文的Linux内核专题:07 配置内核 (3)
- 戴文的Linux内核专题:08 配置内核(4)
- Linux内核中用d_path得到绝对路径名
- Android对Linux内核的改动你知道多少
- selinux介绍及关闭方式!
- Linux 2.6内核配置选项注解
- C/C++内存管理详解