提要
最近抽空重新研读IA-32手册, 顺便整理一下自己对Page mode(chapter 4)的一些理解,以便帮助自己或者其他有需要的朋友做一些总结。
拿来主义
——地址范围、虚拟地址映射为物理地址 以及 分页机制
任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围为0~0xFFFFFFFFFFFFFFFF (16E).这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址。与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集。这里举一个最简单的例子直观地说明这两者,对于一台内存为256M的32bit x86主机来说,它的虚拟地址空间范围是0~0xFFFFFFFF(4G),而物理地址空间范围是0x00000000~0x0FFFFFFF(256M)。
在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写;而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到存储器管理单元MMU,把虚拟地址映射为物理地址。
大多数使用虚拟存储器的系统都使用一种称为分页(paging)机制。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页帧(frame).页和页帧的大小必须相同。在这个例子中我们有一台可以生成32位地址的机器,它的虚拟地址范围从0~0xFFFFFFFF(4G),而这台机器只有256M的物理地址,因此他可以运行4G的程序,但该程序不能一次性调入内存运行。这台机器必须有一个达到可以存放4G程序的外部存储器(例如磁盘或是FLASH),以保证程序片段在需要时可以被调用。在这个例子中,页的大小为4K,页帧大小与页相同——这点是必须保证的,因为内存和外围存储器之间的传输总是以页为单位的。对应4G的虚拟地址和256M的物理存储器,他们分别包含了1M个页和64K个页帧。
分页模式的控制
1. Page Mode
主要分为三种,由CR0.PG, CR4.PAE, IA32_EFER.LME来控制。
a. CR0.pg = 0, 没有页表机制,这时候 线性地址=物理地址, 当然CR4.PAE, IA32_EFER.LME也不起作用。
b. CR0.pg=1, 开始启动页表机制,PG位置1之前必须要求CR0.PE(protection enable)=1, 这时候将根据CR4, IA32_EFER相关bit的设置,进入不同的页表模式。
1. 32-bit paging
CR0.PG = 1 and CR4.PAE = 0
2. PAE paging
CR0.PG = 1, CR4.PAE = 1, and IA32_EFER.LME = 0
3. IA32-e paging(即64bit mode)
CR0.PG = 1, CR4.PAE = 1, and IA32_EFER.LME = 1
2. Paging mode enable
3. 使用CPUID查询Paging feature
作为我们码农,可以通过CPUID来查询你的开发机是否支持某个paging的feature,具体的可以参考如下图
页表管理的多层次架构
三种模式的页表的paging structure都是4096 bytes, 由若干个entries组成,三种paging mode的区别如下表所示:
| paging mode | entry size | entry number |
|---|---|---|
| 32bit paging | 32bits (4bytes) | 1024 entries (4096/4) |
| PAE paging | 64bits (8bytes) (exception: paging structure that is 32 bytes in size, containing 4 64-bit entries) | 512 enties |
| ia32-e paging | 64bits (8bytes) | 512 entries |
处理器根据所给的虚拟地址的高位(具体位数根据不同的page mode所决定), 算出一系列的paging structures entries, 并且最后一层的entry所存的内容为需要翻译的地址区域的物理地址, 我们成为page frame, 它的大小由page directory entry中的PS(page size) bit 来控制,除去决定entries的bits外, 剩下的若干低位决定了该虚拟地址在page frame中的偏移量,我们称为page offset.
1. 32bit paging mode
page walk 计算方式:
PDX =LA >> 22;
PTX =(LA >> 12)&0x3FF;
PDE = ∗ (CR3 + 4 ∗ PDX);
PTE = ∗ ((PDE&0xFFFFF000) + 4 ∗ PTX);
PA =(PTE&0xFFFFF000) + (LA&0xFFF);
page walk 计算方式:
PDX =LA >> 22;
PDE = ∗ (CR3 + 4 ∗ PDX); //PDE with PS=1
PA = ∗ ((PDE取18位) + LA & 0x3FFFFF);
note:
CR3, PDE, PTE如何做取值操作,可以参照下表
2. PAE paging mode
page walk 计算方式:
PDPTEi=LA >> 30;
PDX = (LA >> 20) & 0x1FF;
PTX = (LA >> 12) & 0x1FF;
PDE = *(PDPTEi 取40位+ 8*PDX);
PTE = *(PDE 取40位+8*PTX);
PA = ∗ (PTE 取40位+ LA & 0xFFF);
page walk 计算方式:
PDPTEi=LA >> 30;
PDX = (LA >> 20) & 0x1FF;
PDE = *(PDPTEi取40位+ 8*PDX); //PDE with PS=1
PA = ∗ (PDE取31位 + LA & 0x1FFFFF);
NOTES:
1. M is an abbreviation for MAXPHYADDR
2. CR3 has 64 bits only on processors supporting the Intel-64 architecture. These bits are ignored with PAE paging
3. Reserved fields must be 0.
4. If IA32_EFER.NXE = 0 and the P flag of a PDE or a PTE is 1, the XD flag (bit 63) is reserved.
3. IA-32e paging mode
上边三张表的page walk中, CR3, PDE, PTE的取值方式可以参考下表中的标准来确定:
本文深入探讨IA-32处理器的分页模式,包括虚拟地址到物理地址的映射、分页机制的控制及多层次页表架构。详细介绍了32位分页、PAE分页和IA32-e分页模式,解析了页表转换过程,帮助读者理解MMU在虚拟存储器系统中的作用。

2352

被折叠的 条评论
为什么被折叠?



