MTRR是什么
1.MTRR介绍
MTRR的全称是Memory Type Range Registers,它们是一组组的MSR寄存器对,即范围R和类型T(目前最多有96组),用来指定特定的系统内存段的类型。
这里说的类型,是指内存的CACHE类型。换句话说,MTRR的作用就是:告诉CPU在操作不同的指定的内存的时候应该用什么手段。

为什么要这样做呢?在一般情况下,内存都是应该是被设置为有cache来帮助CPU操作内存的。这样一来,整个系统的效率就会比较高。
但是某些设备所使用的内存却比较特殊,比如说Frame buffer。那么就需要软件(一般情况下是BIOS)配置CPU的相关寄存,来表明CPU在处理某些范围的内存的时候,需要做什么样的动作(也就是类型)。
总的来说它们允许CPU优化不同类型的内存如RAM,ROM和帧缓冲内存(frame buffer),内存操作映射I / O设备。这种做法简化了内存控制系统的硬件设计引脚。
2.举例
上面说的类型,是指内存的CACHE类型,对应的C代码中的实现如下:
//
// Memory cache types
//
typedef enum {
CacheUncacheable = 0,
CacheWriteCombining = 1,
CacheWriteThrough = 4,
CacheWriteProtected = 5,
CacheWriteBack = 6,
CacheInvalid = 7
} MTRR_MEMORY_CACHE_TYPE;
通过MTRR,系统可以优化RAM/ROM/MMIO等不同类型的内存的访问速度。
下面是一个设置MTRR的例子:

3.判断MTRR的支持情况
因为MTRR是MSR寄存器,因此它是跟CPU有关的,并不是所有的CPU都支持。
不过现在的x86平台CPU都支持该功能,事实上从P6型号开始就只是MTRR了。
要判断是否支持MTRR,需要使用CPUID命令,对应的是CPUID.EAX=01H,返回的结果在EDX:

当确定是否支持之后,还需要确定MTRR的支持情况,这对应于一个MSR寄存器(IA32_MTRRCAP)

它是一个只读的寄存器,具体的BIT位说明如下:
SMRR:确定是否支持System-Management Range Register;
FIX:确定是否支持Fixed Range MTRR(两种类型的MTRR,可变和固定);
WC:Write Combining的CACHE类型是否支持;
VCNT:可变MTRR的支持个数。
8296

被折叠的 条评论
为什么被折叠?



