MTRR是什么
1.MTRR介绍
MTRR的全称是Memory Type Range Registers,它们是一组组的MSR寄存器对,即范围R和类型T(目前最多有96组),用来指定特定的系统内存段的类型。
这里说的类型,是指内存的CACHE类型。换句话说,MTRR的作用就是:告诉CPU在操作不同的指定的内存的时候应该用什么手段。
上面说的类型,是指内存的CACHE类型,对应的C代码中的实现如下:
通过MTRR,系统可以优化RAM/ROM/MMIO等不同类型的内存的访问速度
要判断是否支持MTRR,需要使用CPUID命令,对应的是CPUID.EAX=01H,返回的结果在EDX:
MTRR的设置
硬件复位之后,CPU会Disable掉所有的MTRR,此时所有的系统内存都是UNCACHEABLE的。
需要BIOS来完成MTRR,且在多处理器的系统中,各个处理器的设置必须是一致的。
MTRR的设置对应到3类寄存器,首先是一个全局的MSR(IA32_MTRR_DEF_TYPE):
E:MTRR的开关;
FE:固定MTRR的开关;
Type:系统内存的默认CACHE类型,对于没有被MTRR覆盖到的内存段,就使用默认的CACHE类型;
第二类是固定MTRR,因为它们对应的内存段是固定的,所以也比较好理解,下面是所有的固定MTRR:
第三类是可变MTRR,它通过一组MSR寄存器来设置一段内存的属性,这组MSR如下所示:
第一个寄存器设定了内存的基址和类型,而第二个寄存器设置了它的大小以及使能与否。
这里还有一个概念,就是MAXPHYADDR,它表示的是最大支持的系统内存。
虽然我们说现在x86是64位的系统,但是CPU真正只是的系统内存却不是2^64,而是2^MAXPHYADDR,而这个MAXPHYADDR的大小不同系统有不同的值。关于这个值,可以通过CPUID.80000008H获取,下面是具体的代码:
MTRR查看
Linux下查看MTRR的方式:
————————————————
创建Reg1,重启后消失