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 分页模式详解的更多相关文章

  1. Extjs MVC开发模式详解

    Extjs MVC开发模式详解   在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...

  2. JavaScript严格模式详解

    转载自阮一峰的博客 Javascript 严格模式详解   作者: 阮一峰 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict m ...

  3. HTTP协议头部与Keep-Alive模式详解

    HTTP协议头部与Keep-Alive模式详解 .什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器 ...

  4. (" use strict")Javascript 严格模式详解

    Javascript 严格模式详解 转载别人的博客内容,浏览了一遍,没有全部吸收,先保存一下链接 http://www.ruanyifeng.com/blog/2013/01/javascript_s ...

  5. Javascript设计模式之装饰者模式详解篇

    一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点: 1. 在不改 ...

  6. HTTP协议Keep-Alive模式详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp22 HTTP协议Keep-Alive模式详解 1.什么是Keep-Aliv ...

  7. Java开源生鲜电商平台-盈利模式详解(源码可下载)

    Java开源生鲜电商平台-盈利模式详解(源码可下载) 该平台提供一个联合买家与卖家的一个平台.(类似淘宝购物,这里指的是食材的购买.) 平台有以下的盈利模式:(类似的平台有美菜网,食材网等) 1. 订 ...

  8. ext.js的mvc开发模式详解

    ext.js的mvc开发模式详解和环境配置 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开 ...

  9. Docker Kubernetes Service 网络服务代理模式详解

    Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...

随机推荐

  1. word字号

    1 大特号 63 2 特 号 54 3 初 号 42 4 小初号 36 5 大一号 31.5 6 一 号 28 7 小一号 24 8 二 号 21 9 小二号 18 10 三 号 16 11 小三号  ...

  2. 突破MIME限制上传

    方法:找一个正常的可上传的查看其的MIME类型,然后将马子的MIME改成合法的MIME即可.

  3. Okra框架(一) 简介

    Okra是一个构建在Netty框架和Disruptor框架之上轻量级JAVA服务器框架. 使用Netty实现高性能,可灵活扩展的网络通信,使用Disruptor实现高吞吐量,低延迟的并发. Okra主 ...

  4. IDEA 中 右键新建时,没有新建class的解决方案

    今天在用IDEA新建包后,因为我新建的包名是userprivman-data这样的包,然后导致右键后没法新建类,并且在新建包名的时候就提示:不合法的包名,可能不会新建类 然后右键单击包名,发现没有新建 ...

  5. JQuery Show()的几种效果 总有一种是你需要的

    1 show()方法和hide()方法 $("selector").show()  从display:none还原元素默认或已设置的display属性$("selecto ...

  6. MyBatis常用对象SqlSessionFactory和SqlSession介绍和运用

    学习框架一个比较好的路径阅读源码.本文介绍的SqlSessionFactory和SqlSession.可以通过了解SqlSessionFactory接口和SqlSession接口以及两个的实现类入手, ...

  7. Android 开发之环境搭建-0

    Android 开发环境安装与配置 一.开发工具介绍 要进行Android应用程序开发,最起码要有两个工具,一个是Android SDK,它不仅为开发人员提供了丰富的编程接口,而且提供了相关的调试工具 ...

  8. 整理:java定时器。

    本文纯属个人思路,如有错误,请指正. java的Timer依赖Thread,每一个Timer实际上都是一个Thread. import java.util.TimerTask; /** * 本类仅为实 ...

  9. img与特殊布局下对浏览器渲染的剖析

    补白 在内联元素中,分为替换元素和非替换元素(不了解的同学可以百度一下),非替换元素是不可以设置尺寸的,而替换元素作为特殊的内联元素,由于其自身拥有尺寸属性,所以其的尺寸是可以进行再次设置的. 此文适 ...

  10. ios开发之--UIWebView全属性

    最近的项目当中需要用到html和ios的交互,所以就凑空整理一下,所有webView相关的方法和属性,如有不对的地方,请大家不吝指教! 代码如下: 1,创建webview并设置代理 UIWebView ...