内存管理(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机制下的地址映射过程。
相关文章推荐
- 内存管理(3)x86_64地址映射分析
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 内存管理概述、内存分配与释放、地址映射机制
- 内存管理(2)linux的地址映射机制
- 在 linux x86-32 模式下分析内存映射流程
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 在 linux x86-32 模式下分析内存映射流程
- 内存管理概述、内存分配与释放、地址映射机制
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 内存管理:物理地址扩展(PAE)分页机制
- Java 动态代理机制分析及扩展
- linux虚拟进程地址映射机制
- 分页机制_改变地址映射关系
- IPv6无状态地址自动配置机制分析
- MTK内存管理机制简单分析
- Java 动态代理机制分析及扩展
- Java 动态代理机制分析及扩展,第 1 部分
- 计算机原理学习 -- x86-32 CPU和内存管理之分页管理
- Dubbo扩展点机制分析(二)