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. 开启Visual Studio 2013时,出现Microsoft.VisualStudio.Web.PasteJson.JsonPackage无法载入的可能解決方案

    1.先下载:http://www.jb51.net/dll/Microsoft.VisualStudio.Web.PasteJson.dll.html Microsoft.VisualStudio.W ...

  2. 编译Spark2.1.2源码

    源码编译的shell脚本为 /dev/make-distribution.sh ,下载源码包解压就能找到.不同版本使用的参数有差异.可以直接查看make-distribution.sh文件. 下载sp ...

  3. ES-PHP向ES批量添加文档报No alive nodes found in your cluster

    ES-PHP向ES批量添加文档报No alive nodes found in your cluster 2016年12月14日 12:31:40 阅读数:2668 参考文章phpcurl 请求Chu ...

  4. 查看cpu 个数, 内存信息

    查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 查看每个物理CPU中core的个数(即核数) ...

  5. Could not contact Selenium Server; have you started it on 'localhost:4444'

    今天学习selenium RC例子的时候遇到一个问题:java.lang.RuntimeException: Could not contact Selenium Server; have you s ...

  6. 在MVC设计模式中,JavaBean的作用是。(选择1项)

    A.Controller B.Model C.业务数据的封装 D.View 解答:B

  7. Unity5.X 新版AssetBundle打包控制

    一.什么是AssetBundle 估计很多人只知道Unity的模型之类的东西可以导出成一种叫做AssetBundle的文件,然后打包后可以在Unity程序运行的时候再加载出来用.那么AssetBund ...

  8. 《敏捷软件开发-原则、方法与实践》-Robert C. Martin读书笔记(转)

    Review of Agile Software Development: Principles, Patterns, and Practices 本书主要包含4部分内容,这些内容对于今天的软件工程师 ...

  9. 学习《深入理解C#》—— 泛型 (第三章3.1---3.2)

    泛型是什么? 泛型(generic)是C# 2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定 ...

  10. 【原】storm源码之一个class解决nimbus单点问题

    一.storm nimbus 单节点问题概述 1.storm集群在生产环境部署之后,通常会是如下的结构:从图中可以看出zookeeper和supervisor都是多节点,任意1个zookeeper节点 ...