第三章 保护模式的内存管理【2】
 
 
【作者:lion3875 原创文章 参考文献《Intel 64 and IA-32 system programming guide》】


    3.6 分页概述

    在IA-32架构的保护模式中,处理器要么将线性地址空间直接映射至物理内存空间(当拥有4GB物理内存时),要么间接的映射至较小物理内存(低于4GB)或磁盘空间,后一种映射方式通常用于虚拟内存管理。

    启用分页功能后,处理器会将线性地址空间分割成多个固定大小的页面(如4KB、4MB或2MB),然后将这些页面映射到物理内存或磁盘空间。当程序(或任务)访问一个逻辑地址时,处理器便会先将其转换为线性地址,然后再利用分页机制将线性地址转换为物理地址。

    如果一个被访问的页面没有在物理内存中(而是在磁盘空间),处理器便会产生一个“页错误”异常(#PF),此异常的处理程序会指导操作系统或执行体将被访问的页面从磁盘空间装入物理内存(也许这时在物理内存空间的页面正在被写入到磁盘空间)。当页面被装入物理内存后,异常处理程序会正常返回,然后CPU会重新执行导致异常发生那条指令。另外,在页目录及页表中还保存着用于处理器将线性地址转换为物理地址的重要信息,以及用于产生页错误异常的重要信息。

    与分段不同,分页是通过多个固定长度的页面实现的,而分段则是将代码区域的长度与数据区域的长度分开规划的。在分段机制中,一个数据块若需要被装入物理内存,就要一次全部装入,而分页机制则可以将要访问的数据块的一部份装入内存,另一部份留在磁盘空间。

    为了降低地址转换所带来的总线周期开销,最近经常被访问的页目录及页表项会被装入处理器内部的一个器件中,即TLB(旁路转换缓冲)。TLB可以满足当前大多数页目录及页表的读取操作,无需请求总线周期。只有在一个页面长时间不被访问时,才会产生额外的总线周期,因为TLB中不缓存这些被长时间冷落的页面。要了解更多关于TLB的信息,请参见章节3.12“旁路转换缓冲(TLB)”。


    3.6.1 分页选项

    在处理器的控制寄存器中,有三个标志用于控制分页:
  • PG(分页)标志 - 位于CR0的bit31(从Intel386开始,IA-32家族便开始支持此选项)。
     
  • PSE(页面长度扩展)标志 - 位于CR4的bit4(将在Pentium处理器中加以介绍)。
     
  • PAE(物理地址扩展)标志 - 位于CR4的bit5(将在Pentium Pro处理器中加以介绍)。
     
    PG标志用于使能“页转换”机制(即分页机制),如果处理器的页转换机制需要被启用(如有分页需求的虚拟内存系统,或虚拟8086的多任务环境),那么此标志就必须被设置,操作系统或执行体通常会在初始化处理器的过程中设置此标志。

    PSE标志用于使能“大号页面”,如:4-MByte页面或2-MByte页面(2-MByte页面还需要设置PAE标志),若要启用4-KByte页面,则需要将PSE清零,要了解更多PSE相关信息,请参阅章节3.7.2“线性地址转换(4-MByte页面)”,章节3.8.3“使能PAE的线性地址转换(2-MByte页面)”,及章节3.9“使用PSE-36分页机制的36位物理寻址”。

    PAE标志提供了一种扩展物理地址宽度的方法,即MAXPHYADDR。

注意:对于处理器不支持CPUID子命令80000008H的情况,MAXPHYADDR即是36位的,否则将由下面指令来标识MAXPHYADDR的位长,即CPUID.80000008H:EAX[bits 7:0]。

    这种扩展的物理地址只有在分页被使能的情况下才可以使用,而且还要依赖于一个附加的页目录指针表,此表会与页目录及页表配合工作以实现对FFFFFFFFH以外地址空间的寻访。要了解更多运用PAE标志扩展物理地址的相关信息,请参见章节3.8“使用PAE分页机制进行36位物理寻址”。

    在Intel 64位处理器中使能PAE标志,可增强物理寻址范围(例如支持36位以上的物理寻址),主要应用于IA-32e模式的地址转换(参见章节3.10“IA-32e模式的PAE分页”),以及增强老式的地址转换能力(参见章节3.8.1“使用PAE增强老式分页功能”)。

    36位页长度特性(简称PSE-36特性),使得物理寻址范围也可扩展至36位(当然也可以是32位),而这些是要靠设置CR4中的PSE标志来完成的。另外,还可以通过CPUID指令来获悉当前PSE-36的物理寻址能力(此时CPUID的操作数为‘1’,返回值会被保存于EDX的bit17)。要了解更多关于PSE-36物理地址扩展及页长度扩展机制的信息,请参见章节3.9“基于PSE-36分页机制的36位物理寻址”。