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的次方。
下表為各種存取方式對應到MTRR的Type:
Memory Type and Mnemonic | Encoding 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 |
範例:
MTRR | Index | Value | Type/Size | Range |
Base | 200 | 00000006 | WriteBack | |
Mask | 201 | F80000800 | 2048MB | 0 ~ 7FFFFFFF |
Base | 202 | 80000006 | WriteBack | |
Mask | 203 | FC0000800 | 1024MB | 80000000 ~ BFFFFFFF |
略... | ||||
Base | 206 | D8000000 | Uncacheable | |
Mask | 207 | FF8000800 | 128MB | D8000000 ~ DFFFFFFF |
Base | 208 | D7000000 | Uncacheable | |
Mask | 209 | FFF000800 | 16MB | D7000000 ~ D7FFFFFF |
略... |
對於MTRR所需要注意的Type有沒有設定為正確的Type,還有MTRR有沒有被塞爆,可能導致某些要使用Cache的Memory區域會因沒有宣告Cacheable,造成效能低落...等。
沒有留言:
張貼留言