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论坛

原文地址:https://www.cnblogs.com/ck1020/p/6078214.html