Intel系统编程指南第十一章——11.11 存储器类型范围寄存器(MTRR)

以下部分仅适用于P6及更新的处理器家族。

 

存储器范围寄存器(译者注:复数)提供了一个机制用于将存储器类型(见11.3小节)与系统存储器中的物理地址范围相关联起来。它们允许处理器为不同存储器类型优化操作,诸如RAM、ROM、帧缓存存储器以及存储器映射I/O设备。它们也简化了系统硬件设计,通过消除在过去的IA-32处理器上和需要驱动它们的外部逻辑上的用于此功能的存储器控制引脚。

 

MTRR机制允许多达96个存储器范围被定义在物理存储器中,并且它定义了一组模型特定的寄存器(MSR)用于指定包含在每个范围中的存储器类型。表11-8展示了可以被指定的存储器类型以及其属性;图11-4展示了带有MTRR的物理存储器的映射。见11.3小节。

 

在一次硬件复位后,P6和更新的处理器家族禁止所有固定的和可变的MTRR,这在效果上使得所有的物理存储器不可被cache。初始化软件应该随后设置MTRR到一个指定的,系统定义的存储器映射。一般,BIOS(基本输入输出系统)软件用来配置MTRR。操作系统或高级执行程序随后可以自由地使用页级可被cache属性来修改存储器映射。

在一个使用一个P6家族或更新家族中的处理器的多处理器系统中,每个处理器必须使用相同的MTRR存储器映射,这样软件将有对存储器的一致性视野。

注:在多处理器系统中,操作系统必须维护在系统中的所有处理器之间的MTRR一致性(即,所有处理器必须使用相同的MTRR值)。P6和更新的处理器家族不提供硬件支持来维护此一致性。

 

11.11.1 MTRR特征标识

 

MTRR特征的可用性是模型特定的。软件可以通过执行CPUID指令并在特征信息寄存器(EDX)中的MTRR标志(位12)中的状态来判定MTRR是否在一个处理器上被支持。

如果MTRR标志被置1(指示,处理器实现MTRR),那么关于MTRR的额外的信息可以从64位的IA32_MTRRCAP MSR(在P6家族处理器中成为MTRRcap MSR)获得。IA32_MTRRCAP MSR是一个只读的MSR,只能用RDMSR指令读取。图11-5展示了IA32_MTRRCAP MSR的内容。此寄存器的标志和域的功能如下:

1、VCNT(可变范围寄存器的数量)域,位0到7——指示在此处理器上所实现的可变范围寄存器的数量。

2、FIX(固定范围寄存器支持)标志,位8——在置1时,固定范围MTRR(IA32_MTRR_FIX64K_00000到IA32_MTRR_FIX4K_0F8000)被支持;置0时,没有固定范围寄存器被支持。

3、WC(写绑定)标志,位10——当置1时,写绑定(WC)存储器类型被支持;清0时,WC类型不被支持。

4、SMRR(系统管理范围寄存器)标志,位11——当位11被置1时,系统管理范围寄存器(SMRR)接口被支持;当清0时,SMRR不被支持。

 

IA32_MTRRCAP MSR 的位9以及位11到63是保留的。如果软件企图对IA32_MTRRCAP MSR进行写,一个通用保护异常(#GP)会被产生。

软件必须读IA32_MTRRCAP VCNT域来判定可变MTRR的个数并查询IA32_MTRRCAP中的其它特征位来判定一个处理器中所支持的其它能力。比如,某些处理器会报告VCNT域中的值为‘8’,而其它处理器可能会报告不同的值。

 

11.11.2 用MTRR设置存储器范围

 

在每个存储器范围寄存器中所指定的存储器的类型以及存储器范围被三组寄存器设置:IA32_MTRR_DEF_TYPE MSR、固定范围MTRR以及可变范围MTRR。这些寄存器可以分别使用RDMSR以及WRMSR指令来进行读写。IA32_MTRRCAP MSR指示处理器上的这些寄存器的可用性(见11.11.1小节)。

 

11.11.2.1 IA32_MTRR_DEF_TYPE MSR

 

IA32_MTRR_DEF_TYPE MSR(命名为为P6家族处理器的MTRRdefType MSR)设置没有被MTRR所包围的物理存储器区域的默认属性。这个寄存器中的标志和域的功能如下:

1、类型域,位0到7——指示为那些没有被一个MTRR所指定的一个存储器类型的物理存储器地址范围所使用的默认存储器类型(见表11-8)。这个域的有效值为0,1,4,5和6。所有其它值都会导致一个通用保护异常(#GP)产生。

Intel建议对于所有存储器不存在的物理存储器地址使用UC(不被cache的)存储器类型。为了对非存在的存储器位置赋值UC类型,要么被指定为在类型域中的默认类型,要么显式地被固定和可变的MTRR赋值。

2、FE(固定MTRR允许)标志,位10——当置1时,固定范围MTRR被允许;清0时,固定范围MTRR被禁止。当固定范围MTRR被允许时,在范围中有叠交发生时,它们获取优先权覆盖可变范围MTRR。如果固定范围MTRR被禁止,那么可变范围MTRR仍然可以被使用,并且可以映射平常被固定范围MTRR所覆盖的范围。

3、E(MTRR允许)标志,位11——当置1时,MTRR被允许;当清0时,所有MTRR被禁止,并且UC存储器类型被应用到所有物理存储器。当该标志置1时,FE标志可以禁止固定范围MTRR;当该标志清0时,FE标志没有效果。当此E标志被置1时,在默认存储器类型域中所指定的类型被用于没有已被一个固定或是可变的MTRR所映射的存储器区域。

在IA32_MTRR_DEF_TYPE MSR中的位8、9以及位12到63,被保留;处理器产生一个通用保护异常(#GP)如果软件企图对它们写非0值。

 

11.11.2.2 固定范围MTRR

 

固定存储器范围用11个固定范围的寄存器(每个64位)被映射。这些寄存器的每一个被划分为8比特域,用于指定寄存器所控制的每个子范围的存储器类型:

1、寄存器IA32_MTRR_FIX64K_00000——映射512K字节地址范围,从0H到7FFFFH。这个范围被划分为8个64K字节的子范围。

2、寄存器IA32_MTRR_FIX16K_80000和寄存器IA32_MTRR_FIX16K_A0000——映射两个128K字节的地址范围,从80000H到BFFFFH。这个范围被划分为16K字节的子范围,每个寄存器8个范围。

3、寄存器IA32_MTRR_FIX4K_C0000IA32_MTRR_FIX4K_F8000——映射八个32K字节的地址范围,从C0000H到FFFFFH。这个范围被划分位64个4K字节子范围,每个寄存器8个范围。

表11-9展示了固定物理地址范围与相应的固定范围MTRR的域之间的关系。表11-8展示了MTRR的存储器类型编码。

 

11.11.2.3 可变范围MTRR

 

奔腾4、Intel至强、以及P6家族处理器允许软件为m个可变大小地址范围指定存储器类型,每个范围使用一对MTRR。所支持范围的个数m在IA32_MTRRCAP MSR的位7:0中给出(见图11-5,11.11.1小节)。

在每对(IA32_MTRR_PHYSBASEn)中的头个条目定义了基地址和范围的存储器类型;第二个条目(IA32_MTRR_PHYSMASKn)包含了一个用于确定地址范围的掩膜。后缀“n”在范围0到m-1,并标识了一个特定的寄存器对。

对于P6家族处理器,这些可变范围MTRR的前缀是MTRRphysBase和MTRRphysMask。

图11-7展示了这些寄存器中的标志和域。这些标志和域的功能为:

1、类型域,位0到7——为范围指定存储器类型(见表11-8)

2、PhysBase域, 位12到(MAXPHYADDR-1)——指定地址范围的基地址。此24位值,在MAXPHYADDR为36位的情况下,在低端扩展12位来形成基地址(这自动在一个4K字节边界上的地址对齐)。

3、PhysMas域, 位12到(MAXPHYADDR-1) ——指定一个掩膜(如果最大物理地址大小为36位,则为24位;如果最大物理地址大小为40位,则为28位)。这个掩膜根据以下关系确定正被映射的区域的范围:

——Address_Within_Range ‘按位与’ PhysMask = PhysBase ‘按位与’ PhysMask

——这个值在低端扩展12位以形成掩模值

——PhysMask域的宽度依赖于处理器所支持的最大物理地址大小

CPUID.80000008H给出处理器所支持的最大物理地址大小。如果CPUID.80000008H不可用,软件必须假定处理器支持一个36位物理地址大小(那么PhysMask是24位宽,并且IA32_MTRR_PHYSMASKn的高28位被保留)。

4、V (有效) 标志, 位11——当置1时,允许寄存器对;当清0时,禁止寄存器对。

IA32_MTRR_PHYSBASEn和IA32_MTRR_PHYSMASKn中的所有其它位被保留;如果软件企图对它们写,那么处理器会生成一个通用保护异常。

 某些掩膜值会导致不连续的范围。在这样的范围内,没有被掩膜值映射的区域被设置为默认存储器类型。Intel并不鼓励“非连续”范围的使用,因为它们可能要求存储器通过整个4GB物理存储器映射都存在。如果存储器没有被提供,那么行为是未定义的。

 

注:对于软件,通过使用ACPI/INT15 e820接口机制来解析BIOS所提供的存储器描述是可能的。这个信息然后可以被用于判定MTRR如何被初始化(比如,允许BIOS定义由平台、包括处理器所支持的有效的存储器范围以及最大存储器范围)。

见11.11.4.1小节

 

11.11.2.4 系统管理范围寄存器接口

 

如果IA32_MTRRCAP[位11]被置1,那么处理器支持SMRR接口以限制对一个指定的由系统管理模式(SMM)软件所使用的存储器地址范围的访问(见26.4.2.1小节)。如果SMRR接口被支持,那么SMM软件被强烈鼓励使用它以保护由SMRAM区域中的SMI处理例程所存储的SMI代码和数据。

系统管理范围寄存器由一对MSR构成(见图11-8)。IA32_SMRR_PHYSBASE MSR定义了SMRAM存储器范围的基地址以及在SMM中用于访问它(译者注:指SMRAM存储器范围)的存储器类型。IA32_SMRR_PHYSMASK MSR包含了一个有效位和一个确定由SMRR接口所保护的SMRAM地址范围的掩膜。这些MSR只可以在SMM下被写;一个企图在SMM外对它们的写将导致一个通用保护异常。

 

图11-8展示了这些寄存器中的标志和域。这些标志和域的功能如下:

1、类型域,位0到7——指定了范围的存储器类型

2、PhysBase域,位12到31——指定了地址范围的基地址,地址必须小于4G字节并且被自动地在一个4KB边界上对齐。

3、PhysMask域,位12到31——指定了一个确定正被映射的区域的范围的掩膜,根据下列关系:

——在范围内的地址 AND PhysMask = PhysBase AND PhysMask

——这个值在低端被扩展12位以形成掩膜值。对于更多的信息,见11.11.3小节。

4、V(有效)标志,位11——当置1时,允许寄存器对;清0时,禁止寄存器对。

 

在企图访问这些SMRR寄存器之前,软件必须测试IA32_MTRRCAP寄存器中的位11。如果SMRR不被支持,那么对这些寄存器的读写会导致通用保护异常。

当IA32_SMRR_PHYSMASK MSR的有效标志为1时,对指定的地址范围的访问被如下对待:

1、如果逻辑处理器在SMM下,那么访问使用IA32_SMRR_PHYSBASE MSR中的存储器类型。

2、如果逻辑处理器不在SMM下,那么写访问被忽略,而读访问返回为每个字节的一个固定值。不可被cache的存储器类型(UC)被用于这种情况。

 

即使所指定的地址范围与由MTRR所指定的一个范围叠交,也应用上述条款。

 

11.11.3 例子,基和掩膜计算

 

本小节中的例子应用于支持一个36位的最大物理地址大小的处理器。进入到可变范围MTRR中的基和掩膜值是24位值,这些值由处理器扩展到36位。

比如,要进入一个IA32_MTRR_PHYSBASE3寄存器中基地址为2M字节(00200000H)的话,12位最低有效位被截断,并且值000200H值被输入到PhysBase域中。对掩膜值也必须进行相同的操作。比如,映射地址范围从200000H到3FFFFFH(2MB到4MB),需要一个掩膜值FFFE00000H。再一次,该掩膜值的最低有效位被截断,这样,输入到IA32_MTRR_PHYSMASK3的PhysMask域中的值为FFFE00H。这个掩膜被选择,以至于在200000H到3FFFFFH范围中的任一地址与掩膜值(200000H)相‘与’。

为了要映射范围从400000H到7FFFFFH(4MB到8MB)的地址范围,000400H的一个基值被输入到PhysBase域中并且一个掩膜值FFFC00H被输入到PhysMask域中。

 

11.11.4 范围大小和对齐要求

 

要被映射到一个可变范围的MTRR的一个范围必须满足以下“2的幂”大小和对齐规则:

1、最小范围大小为4KB,并且范围的基地址必须在一个至少4K字节边界处对齐。

2、对于大于4KB的范围,每个范围必须是长度2n并且其基地址必须在一个2n的边界处对齐,而n是一个大于等于12的值。基地址对齐值不能比其长度更小。比如,一个8KB范围不能在一个4KB边界处对齐。它必须在至少一个8KB边界处对齐。

 

11.11.4.1 MTRR优先权

 

如果MTRR不被允许(通过设置IA32_MTRR_DEF_TYPE MSR中的E标志),那么所有存储器访问都是UC存储器类型的。如果MTRR被允许,那么用于一次存储器访问的存储器类型由下列条件进行判定:

1、如果物理地址落在物理存储器的首个1MB内,并且固定MTRR被允许,那么处理器使用为合适的固定范围MTRR所存储的存储器类型。

2、否则,处理器试图用一个由可变范围的MTRR所设置的一个存储器类型来匹配物理地址:

    ——如果一个可变存储器范围匹配,那么处理器使用在为那范围的IA32_MTRR_PHYSBASEn寄存器中所存储的存储器类型。

    ——如果两个或更多的可变存储器范围匹配,并且存储器类型是相同的,那么那个存储器类型被使用。

    ——如果两个或更多的可变存储器范围匹配,并且其中一个存储器类型是UC,那么UC存储器类型被使用。

    ——如果两个或更多的可变存储器范围匹配,并且存储器类型是WT和WB,那么WT存储器类型被使用。

    ——对于在上述规则中没有被定义的叠交,处理器的行为是未定义的。

3、如果没有可变或固定的存储器范围匹配,那么处理器使用默认的存储器类型。

 

 

11.11.5 MTRR初始化

 

 

你可能感兴趣的:(编程,优化,cache,测试,存储,扩展)