MMU从浅入深--分页模式

本文深入探讨IA-32处理器的分页模式,包括虚拟地址到物理地址的映射、分页机制的控制及多层次页表架构。详细介绍了32位分页、PAE分页和IA32-e分页模式,解析了页表转换过程,帮助读者理解MMU在虚拟存储器系统中的作用。

提要

最近抽空重新研读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 modeentry sizeentry number
32bit paging32bits (4bytes)1024 entries (4096/4)
PAE paging64bits (8bytes) (exception: paging structure that is 32 bytes in size, containing 4 64-bit entries)512 enties
ia32-e paging64bits (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
32bit paging with 4K page frame

page walk 计算方式:
PDX =LA >> 22;
PTX =(LA >> 12)&0x3FF;
PDE = ∗ (CR3 + 4 ∗ PDX);
PTE = ∗ ((PDE&0xFFFFF000) + 4 ∗ PTX);
PA =(PTE&0xFFFFF000) + (LA&0xFFF);

32bit paging with 4M page frame
page walk 计算方式:
PDX =LA >> 22;
PDE = ∗ (CR3 + 4 ∗ PDX); //PDE with PS=1
PA = ∗ ((PDE取18位) + LA & 0x3FFFFF);

note:
CR3, PDE, PTE如何做取值操作,可以参照下表
32bit_paging_cr3&_paging_structure_entries_format

2. PAE paging mode
PAE paging with 4K page frame
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);

PAE paging with 2M page frame
page walk 计算方式:
PDPTEi=LA >> 30;
PDX = (LA >> 20) & 0x1FF;
PDE = *(PDPTEi取40位+ 8*PDX); //PDE with PS=1
PA = ∗ (PDE取31位 + LA & 0x1FFFFF);

PAE_pagin_cr3&paging_structure_entries_format


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

ia32-e_paging_4K

ia32-e_paging_2m.png

ia32-e_paging_1G.png

上边三张表的page walk中, CR3, PDE, PTE的取值方式可以参考下表中的标准来确定:
ia32_paging_CR3&paging structure entries.png

Reference:

  1. 百度百科MMU介绍
  2. Intel® 64 and IA-32 Architectures Software Developer Manuals
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值