PAE 分页模式详解
2016-11-18
记得之前看windows内核原理与实现的时候,在内存管理部分,看到涉及到PAE模式的部分,提到此模式下可以让系统在虚拟地址还是32位宽的情况下,支持64GB的物理内存或者更多。当时就没怎么想明白,今天突然想起就结合intel手册仔细研读了一番,但是手册所讲主要是其寻址过程以及各级页表和entry的结构,对如何支持这一说还真没有提到。于是乎,google、上论坛等等,初步对其有了认识,难免让人失望,因为其着实没有我想的那么玄乎,下面还是分享下:
PAE模式是基于分页模式的,如果CR.PG=1,CR4.PAE=1,则表示PAE模式被启用。
根据手册介绍,PAE模式下,一个32位的线性地址(虚拟地址)被翻译成一个52位的物理地址,这句话才是整个PAE模式的精髓。52是最大支持的位数,所以按照PAE的思想,其实不只可以支持64GB,还可以更多。至于这个限制,而为何要限制于64GB,这点恐怕又和PAE的工作模式相关。
PAE模式如何支持大于32GB的物理内存?
PAE模式下,系统中的进程任意时刻还是只能访问4GB的地址空间,这是虚拟地址宽度所限,但是考虑到一般的页表项结构,低12位做各种标志,高20位作为物理页框号,这样满打满算也就可以定位2^20=1M个物理页面,也就是在普通模式下无论如何最高只能支持4GB物理内存。
PAE模式下就不同了,其稍微改变了下页表结构,把一个32位的虚拟地址分成4个部分:
0-11:页内偏移
12-20:页表(Page Table)
21-29:页表目录表(Page Table Directory)
30-31:页目录指针表(Page Directory Pointer Table)
可以看到,这里PAE的分页把页表项做成了8个字节,即64Bit,除去低12位做标志,还有52位可以用作寻址物理页框,这正是PAE模式的核心。
细心的人可能会发现,即使如此,虚拟地址一共就32位,你2^2*2^9*2^9*4KB仍然是4GB 呀,怎么说就支持大于4GB的呢?没错,这也正是我开始疑惑的地方。但是人家根本没把思想放在这方面,这也正是前面提到任意时刻,一个进程最高只能使用4GB的原因。重要的在于操作系统是多任务的,如果是在普通模式下,我现在有8GB的物理内存,而当前系统运行5个进程和系统进程,如果每个进程当前都需要1GB的物理内存,则在此模式下使行不通的,这6个进程只能平分8GB中的4GB,其他的只能通过不停的换入换出来实现。
而在支持PAE模式的情况下就不同了,上面6个进程均可分到1GB物理内存,并且在需要的时候还可以增加。这就是PAE带来的好处。
话说说到这里,可能还有人不明白。分页机制中有个重要的概念就是物理页框号,页表能够层层递进正是在页表项中记录了物理页框号。物理页框号可是全局的,即在整个系统中不会有重复的物理页框。在普通模式下,只有20位用于物理页框号,那么最高也就是支持2^20=1M个页,即4GB物理内存。其他的有再多的内存寻址不到啊!
在PAE模式下,使用36根地址线,最大可以索引到64GB的物理内存。由于页表项中有52位可以作为页框号,所以其可以定位更多的物理页框。即使碍于虚拟地址宽度所限,一个进程只能访问4GB空间,但是放大格局。站在系统的角度,则是在其他的进程需要的时候,可以减少换出内存的次数,这是后备力量的加强!!
说到这里应该说的比较明白了,下面看PAE工作模式:
说到PAE的工作模式,其实本质上和普通的页表没什么区别,仍然是一级一级寻址而已,只是在具体寻址方法上有了细微的差别。
PAE模式下的不同之处:
1、CR3的值。PAE模式下,CR3存储的是页目录指针表的地址,页目录指针表是32字节对齐的,其大小为32字节,所以此模式下的CR3结构如下:

其中每个表项是8个字节,共有四个表项,每个表项对应1GB的内存空间。对应于这四个表项,处理器为每个表项维护一个寄存器称为PDPTE0,PDPTE1,PDPTE2,PDPTE3。处理器在适当的时候从
页目录指针表中加载值到这些寄存器,在访问的时候使用寄存器来访问,也减少了一次内存访问哈!具体的时机如下:
1、PAE模式被启用时。
2、进程任务切换时,即CR3的值改变的时候。
3、在VMX模式转换的时候(虚拟化相关),本质上还是CR3值的变化。
所以此模式下,虽然CR3的作用依然如故,但是在寻址的时候可以直接利用PDPTE寄存器来定位具体的页目录了。PDPTE结构如下:

最下面的的M表示的是是实际的物理地址位宽,假如说是64GB即36位,那么M=36。通过12~(M-1)可以定位一个具体的物理页框。
根据虚拟地址的21-29位作为偏移定位一个页目录页表项,表项的第7位(从0开始)表明该表项是指向一个页表还是一个2MB 的页。
当表项指向一个2M的页时,具体表项结构如下:

当表项指向一个页表时,结构如下:


而具体的地址翻译过程,看下图:
参考:
1、intel手册
2、stackOverflow论坛
PAE 分页模式详解的更多相关文章
- Extjs MVC开发模式详解
Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...
- JavaScript严格模式详解
转载自阮一峰的博客 Javascript 严格模式详解 作者: 阮一峰 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict m ...
- HTTP协议头部与Keep-Alive模式详解
HTTP协议头部与Keep-Alive模式详解 .什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器 ...
- (" use strict")Javascript 严格模式详解
Javascript 严格模式详解 转载别人的博客内容,浏览了一遍,没有全部吸收,先保存一下链接 http://www.ruanyifeng.com/blog/2013/01/javascript_s ...
- Javascript设计模式之装饰者模式详解篇
一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点: 1. 在不改 ...
- HTTP协议Keep-Alive模式详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp22 HTTP协议Keep-Alive模式详解 1.什么是Keep-Aliv ...
- Java开源生鲜电商平台-盈利模式详解(源码可下载)
Java开源生鲜电商平台-盈利模式详解(源码可下载) 该平台提供一个联合买家与卖家的一个平台.(类似淘宝购物,这里指的是食材的购买.) 平台有以下的盈利模式:(类似的平台有美菜网,食材网等) 1. 订 ...
- ext.js的mvc开发模式详解
ext.js的mvc开发模式详解和环境配置 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开 ...
- Docker Kubernetes Service 网络服务代理模式详解
Docker Kubernetes Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...
随机推荐
- JS学习笔记(5)--一道返回整数数组的面试题(经验之谈)
说明: 1. 微信文章里看到的,作者是马超 网易高级前端技术经理,原文在网上搜不到,微信里可以搜“为什么你的前端工作经验不值钱?”,里面写着“转载自网易实践者社区”.(妈蛋,第二天网上就有了http: ...
- mof提权原理及其过程
mof提权的原理: mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做"托管对象格式"其作用是每隔五秒就 ...
- linux socket can测试
1. Overview / What is Socket CAN -------------------------------- The socketcan package is an implem ...
- CSS——div居中,window.open(0
margin:0 auto 表示什么意思?? margin后面如果只有两个参数的话,第一个表示top和bottom,第二个表示left和right因为0 auto,表示上下边界为0,左右则根据宽度自适 ...
- netifd
Netifd是OpenWrt中用于进行网络配置的守护进程,基本上所有网络接口设置以及内核的netlink事件都可以由netifd来处理完成. 在启动netifd之前用户需要将所需的配置写入uci配置文 ...
- 基于zookeeper、连接池、Failover/LoadBalance等改造Thrift 服务化
对于Thrift服务化的改造,主要是客户端,可以从如下几个方面进行: 1.服务端的服务注册,客户端自动发现,无需手工修改配置,这里我们使用zookeeper,但由于zookeeper本身提供的客户端使 ...
- Linux crontab 实现每秒执行
Linux crontab 实现每秒执行 linux crontab 命令,最小的执行时间是一分钟.如需要在小于一分钟内重复执行,可以有两个方法实现. 1.使用延时来实现每N秒执行 创建一个php做执 ...
- Android多媒体系列2:利用MediaRecorder实现录音
- 你不知道的JavaScript学习笔记1——作用域
处理程序三要素: 引擎:编译与执行过程. 编译器:语法分析与代码生成等. 作用域:收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权 ...
- 第二百七十一节,Tornado框架-CSRF防止跨站post请求伪造
Tornado框架-CSRF防止跨站post请求伪造 CSRF是什么 CSRF是用来在post请求时做请求验证的,防止跨站post请求伪造 当用户访问一个表单页面时,会自动在表单添加一个隐藏的inpu ...