以下部分僅適用於P6及更新的處理器家族。
儲存空間範圍寄存器(譯者註:複數)提供了一個機制用於將儲存空間類型(見11.3小節)與系統儲存空間中的物理位址範圍相關聯起來。它們允許處理器為不同儲存空間類型最佳化操作,諸如RAM、ROM、幀緩衝儲存空間以及儲存空間映射I/O裝置。它們也簡化了系統硬體設計,通過消除在過去的IA-32處理器上和需要驅動它們的外部邏輯上的用於此功能的儲存空間控制引腳。
MTRR機制允許多達96個儲存空間範圍被定義在實體儲存體器中,並且它定義了一組模型特定的寄存器(MSR)用於指定包含在每個範圍中的儲存空間類型。表11-8展示了可以被指定的儲存空間類型以及其屬性;圖11-4展示了帶有MTRR的實體儲存體器的映射。見11.3小節。
在一次硬體複位後,P6和更新的處理器家族禁止所有固定的和可變的MTRR,這在效果上使得所有的實體儲存體器不可被cache。初始化軟體應該隨後設定MTRR到一個指定的,系統定義的儲存空間映射。一般,BIOS(基本輸出入系統 (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_C0000到IA32_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初始化