您的位置:首页 > 其它

内存管理(4)x86_32地址映射(扩展机制)分析

2014-03-06 22:16 931 查看

1.PAE和PSE

1.1、PAE(Physical Address Extensions)

        在x86 CPU中,只有32位地址总线,也就意味着只有4G地址空间。为了实现在32位系统中使用更多的物理内存,Intel CPU提供了PAE(Physical Address Extensions)机制,这样可以使用超过4G物理内存。

        PAE机制的打开,需要设置CR0、CR4控制寄存器和IA32_EFERMSR寄存器。设置值为CR0.PG = 1,CR4.PAE = 1和IA32_EFER.LME = 0。但PAE机制打开后,MMU会将32位线性地址转换为52位物理地址。尽管物理地址是52位(4PB),但线性地址仍然为32位,即进程可使用的虚拟内存不超过4GB。

1.2、PSE(Page Size Extensions)

前面提到x86/x86_64 CPU中提供的是段页式机制,也介绍了页面。页面大小虽然是固定的,但x86/x86_64 CPU支持两种页面大小4KB和4MB。大多数情况下OS内核使用的是4KB页面,但系统中多数进程使用内存较大时,如每次申请至少4MB,则使用4MB页面较为合适。当控制寄存器CR4.PSE = 1时,页面大小是4MB。

2.PAE页面机制地址映射过程

PAE(Physical Address Extension)是IA-32架构中物理地址扩展机制。在正常情况下,32位系统只能使用4G物理内存,但使能PAE机制后使地址总线达到36根,最大可以访问64G物理内存。必须设置CR0寄存器的第31bit为0(CR0.PG=1),打开页式映射机制;设置CR4寄存器第5bit为1(CR4.PAE=1)和IA32_EFERLMW=0,使能PAE机制。当逻辑处理器使用PAE页面机制时,会将32位线性地址转换为52位物理地址。

2.1 PDPTE寄存器

当使用PAE机制时,CR3寄存器的值是指向32字节对齐的页面目录指针表(Page Directory PointerTable)。

                                           图1 PAE机制下CR3寄存器的使用



页面目录指针表中共有4个64bit项,称为PDPTEs。每个PDPTE控制1G线性地址空间的访问。对应PDPTE,逻辑处理器维护4个架构无关的内部PDPTE寄存器,分别为PDPTE0、PDPTE1、PDPTE2、PDPTE3。

                                           图2 PAE机制下PDPTE格式



2.2逻辑地址到线性地址的映射

PAE机制仅与页面映射有关,因此逻辑地址到线性地址映射过程一样。详细步骤请参考地址映射部分的非PAE机制下映射过程。

2.3 线性地址到物理地址的映射

PAE机制可以映射4K页面或者2MB页面,在此我们仅考虑4K页面的映射过程,如下图所示。



                                          图  PAE机制下(32bit)线性地址到(52bit)物理地址的映射过程

从线性地址到物理地址的映射过程为:

(1)PDPTE值的来源

线性地址的30~31bit用来选择PDPTE寄存器,即PDPTEi,i的值就是31:30的值。因为线性地址的31:30两个bit用来选择PDPTE寄存器,因此只能控制访问1GB的线性地址空间。当PDPTEi寄存器的P标志位(bit
0)值为0时,CPU就忽略63:1,表示该寄存器控制的1GB线性地址空间没有对应的映射(即这段线性地址还没有分配相应的物理内存),当访问这段线性地址时,就会产生页面错误异常。
(2)页面目录表项

当PDPTEi寄存器的P标志位为1时,页面目录表(Page Directory Table)的地址在PDPTEi寄存器的51:12(相当于非PAE机制下CR3寄存器的值)。页面目录表由512个64bit页面目录项(PageDirectory Entry)组成。具体目录项(PDE)物理地址计算方法:
    Bits 51:12来自PDPTEi (页面目录表的地址)
    Bits 11:3是线性地址的bit29:21 (页面目录表内偏移)

    Bits 2:0为0

(3)页面表项

PDE(页面目录项) 的51:12是页面表的起始物理地址。具体的页面表(PTE)物理地址计算方法:
    Bits 51:12来自PDE(页面表的起始地址)

    Bits 11:3是线性地址的bit20:12 (页面表内偏移)

    Bits 2:0为0

(4)最终物理地址的计算方法
    Bits 51:12来自PTE(页面的起始地址)
    Bits 11:0是线性地址的bit20:12 (页面内偏移)

3、地址映射过程分析

    测试代码和x86_64下差不多,段式映射也差不多,主要是页式映射的区别。

    PSE = 2既支持  PAE = 1 启用地址扩展机制

页式映射过程

程序给出临时变量tmp的地址是0xBF820B90,将其以二进制表示为(高2bit、中间9bit、中间9bit、最后12bit)。

高2bit用来选择PDPTEi寄存器,PDPTEi寄存器的内容是存放在内存中的。共有4个PDPTE寄存器,组成PDPTE表,物理起始地址在CR3寄存器中。



PSE = 1 ,表示4k页面,PSA = 1  表示使能地址扩展。

CR3寄存器值为0x2af6000。

2       9                  9                       12

10 111111101 000111110 110101001100

2                                           d4c

(111111101b)*8 = 0xfe8

(000111110b)*8
= 0x1f0

1. PDPTE2寄存器的值



2. 页面目录表的起始地址

因此页面目录表的起始物理物理为0x2aca4000。
3. 页面表的地址
0x2aca4000 +
0xfe8
= 0x2aca4fe8,即页面表的物理地址存放在0x2aca4fe8地址处。



4. 页面表项值

页面表项的值就是tmp变量所在物理页面的起始地址。来看一下页面表项的值。

0x6679e000 +0x1f0
= 0x6679e1f0。该处内容为0x8000000068968...

5. 物理页面地址和tmp变量物理地址计算

tmp变量所在物理页面起始地址为0x6679e1f0。因此tmp变量所在物理地址为:

0x68968000
+ 0xd4c = 0x68968d4c。我们来验证一下物理地址0x7C9ECB90存放的数据是什么。



物理地址0x68968d4c存放的数据确实是0x12345678,和我们代码中赋值一致。至此,我们完整地验证了32位系统中PAE机制下的地址映射过程。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: