为什么我在IA32_MTRRCAP寄存器的保留位上获得1?

时间:2017-03-09 12:54:19

标签: memory-management x86-64 intel mmu

我试图在xen-4.5.0上进行一些内存管理,并对MTRR(内存类型范围寄存器)的某些内容感到困惑。当我试图获得IA32_MTRRCAP寄存器的值时,我得到了值1d0a。

然而,在2016年12月发布的英特尔手册中,IA32_MTRRCAP寄存器的第12-63位都标记为保留,而第12位则为1。为什么?

与此同时,当我试图从MTRR读取内存信息时,我找不到大部分内存地址。

我已经在使用Intel Skylake处理器的几台机器上试过这些,但它们的情况是一样的。但在使用Intel Haswell处理器的机器上,IA32_MTRRCAP的价值并不奇怪,我也可以从MTRR读取所有内存信息。

Skylake的MTRR编程方式是否有所改变?我只能这样猜。

感谢。

1 个答案:

答案 0 :(得分:0)

我假设读取的值是正确的 - 因为它们似乎是正确的。
保留位不必为零,保留更接近意味着“由英特尔工程内部使用”。

  

1.3.2保留位和软件兼容性

     

在许多寄存器和存储器布局描述中,某些位被标记为保留。位被标记为   保留,对于与未来处理器的兼容性,软件将这些位视为具有未来,   虽然未知,但效果。

     

保留位的行为不仅应视为未定义,而且应视为不可预测的

     

软件在处理保留位时应遵循以下指南:

     
      
  • 在测试包含这些位的寄存器的值时,不要依赖于任何保留位的状态
      在测试之前屏蔽保留位。
  •   
  • 存储到存储器或寄存器时,不要依赖任何保留位的状态。
  •   
  • 不依赖于保留写入任何保留位的信息的能力。
  •   
  • 加载寄存器时,始终使用文档中指示的值加载保留位(如果有)   或者使用先前从同一寄存器中读取的值重新加载它们。
  •   
     

注意
  避免任何软件依赖于Intel 64和IA-32寄存器中保留位的状态。   根据保留寄存器位的值,软件将取决于处理器处理这些位的未指定方式。依赖于保留值的程序可能与未来的处理器不兼容。

Skylake中的MTTR没有变化,它们的架构行为仍然是您提到的手册中定义的行为。