2011年11月18日 星期五

MTRR


MTRR (Memory type range registers) 是CPU內的一組MSR (Model-specific registers) ,它作用為告訴CPU要如何最佳的存取各個記憶體區段,簡單來說是CPU要以哪種快取模式來進行存取。

通常MTRR的初始化是BIOS的任務。

在UEFI中可以使用EfiReadMsr, EfiWriteMsr, MsrRead64, MsrWrite64...等Function來存取,只要拉相對應的Header與Library就好。


IA32_MTRRCAP, Index: 0xFE, Read-Only.
  • VCNT (variable range registers count) bits 0 ~ 7 - 指出這個CPU支援幾組動態的MTRR,MTRR也是有數量的,也有機會被塞爆。
  • FIX (fixed range registers supported) flag, bit 8 - 指出是否支援Fixed range MTRRs (IA32_MTRR_FIX64K_00000 through IA32_MTRR_FIX4K_0F8000)。
  • WC (write combining) flag, bit 10 - 是否支援write-combining (WC) memory。
  • SMRR (System-Management Range Register) flag, bit 11 - 是否支援SMRR。


IA32_MTRR_DEF_TYPE, Index: 0x2FF.
  • Type field, bits 0 ~ 7 - 指出未涵蓋在MTRR所定義的記憶體該以何種Cache為預設值。
  • FE (fixed MTRRs enabled) flag, bit 10 - Enable或Disable Fixed-range MTRR。
  • E (MTRRs enabled) flag, bit 11 - Enable或Disable動態的MTRR。


Variable - Range Register Pair
一組MTRR有兩個Registers,Base與Mask,起始索引可參考EDK的定義:
#define EFI_CACHE_VARIABLE_MTRR_BASE 0x200

  • Type field, bits 0 ~ 7 - 此MTRR所定義的範圍該以何種Cache方式存取。
  • Valid field, bits 11 - 指出此組MTRR是否有效。
  • PhysBase field, bits 12 ~ (MAXPHYADDR-1) - 取12 ~ (MAXPHYADDR-1) bits,補上3個0,就是組MTRR的Base Address。
  • PhysMask field, bits 12 ~ (MAXPHYADDR-1) - 一樣只取12 ~ (MAXPHYADDR-1) bits,補上3個0,再做1的補數運算,即可算出此MTRR的長度,值得注意的是長度需為2的次方。
MAXPHYADD代表是CPU的定址能力,長度依CPU而定。

下表為各種存取方式對應到MTRR的Type:
Memory Type and MnemonicEncoding in MTRR
Uncacheable (UC)00h
Write Combining (WC)01h
Reserved*02h
Reserved*03h
Write-through (WT)04h
Write-protected (WP)05h
Writeback (WB)06h
Reserved*07h ~ FFh


範例:
MTRRIndexValueType/SizeRange
Base20000000006WriteBack
Mask201F800008002048MB0 ~ 7FFFFFFF
Base20280000006WriteBack
Mask203FC00008001024MB80000000 ~ BFFFFFFF
略...
Base206D8000000Uncacheable
Mask207FF8000800128MBD8000000 ~ DFFFFFFF
Base208D7000000Uncacheable
Mask209FFF00080016MBD7000000 ~ D7FFFFFF
略...

對於MTRR所需要注意的Type有沒有設定為正確的Type,還有MTRR有沒有被塞爆,可能導致某些要使用Cache的Memory區域會因沒有宣告Cacheable,造成效能低落...等。

沒有留言:

張貼留言