2019年3月17日 星期日

Memory Type Range Register (MTRR)

MTRR 為幾組CPU 所提供的MSR 暫存器,用來描述記憶體的區段讓CPU知道該用哪一種
Cache模式來存取。

CPU可用的快取模式為下列幾種
                       
  Memory Type and Mnemonic    Encoding in MTRR  
Uncacheable (UC)00H
Write Combining (WC)01H
Reserved02H
Reserved03H
Write-through (WT)04H
Write-protected (WP)05H
Write-back (WB)06H
Reserved07H-FFH


可藉由讀取CPUID判斷此CPU支不支援MTRR
CPUID Function 0x00000001, EDX
bit 12 - MTRR supported

MTRRCap - MTRR Capabilities

0x000000FE


bit 0-7 (VCNT) - Variable range register 的數量
bit 8 (FIX) - 是否支援Fixed range register
bit 10 (WC) - 是否支援Write Combining的cache type
bit 11 (SMRR) - 是否支援SMRR

MTRR 可以分為兩種,Fixed range register 與Variable range register,1MB記憶體以下位置的
cache 是由Fixed range register來控制,1MB以上就由Variable range register控制,剩下未被
指定的記憶體區塊就由 MTRRdefType (0x000002FF) 的bit0-7 來決定。



MTRRdefType - MTRR Default Memory Type

0x000002FF


bit 0-7 (Type) - 未被MTRR指定的Memory cache type
bit 10 (FE) - Enable Fixed MTRR
bit 11 (E) - Enable MTRR


1MB以下的記憶體由Fixed Range MTRR控制,可分為一組64k、兩組16k和八組4k,每組中可指
定八段range。

MtrrVar_64K

0x00000250

MtrrVar_16K

0x00000258, 0x00000259

MtrrVar_4K

0x00000268 - 0x0000026F


bit 0-3 (Type) - Memory cache type


1MB以上的記憶體可用Variable Range MTRR來控制,由Base與Mask成對組成,並可以指定長
度,其支援的數量可由MTRRCap的VCNT讀出

MtrrVarBase

0x00000200, 0x00000202, ...

bit 0-7 (Type) - 指定range的Memory cache type
bit 12-MAXPHYADDR (PhysBase) - 後面補上3個0,即為base address
  MAXPHYADDR為CPU的定址能力,可從CPUID Function 0x80000008讀出

MtrrVarMask

0x00000201, 0x00000203, ...

bit 11 (V) - 此組MTRR是否有效
bit 12-MAXPHYADDR (PhysMask) - 後面補上3個0,再取2的補數,即為MTRR長度
  Address_Within_Range & PhysMask == PhysBase & PhysMask

沒有留言:

張貼留言