英特尔有时会使用MSR_
前缀作为 MSR 名称,有时甚至IA32_
会使用 前缀来表示同一个 MSR。
例如,在 SNB 上,在SDM 第 4 卷中,他们记录了MSRIA32_PERF_STATUS
和MSR_PERF_STATUS
MSR 0x198
,其中位的值有些不同(但不完全不一致1):
那是怎么回事?
1从某种意义上说,在版本中定义为保留的位在IA32
版本中具有特定含义MSR
。
一些 MSR 寄存器是体系结构的,这意味着它们保证在所有未来的处理器上都得到支持(并且定义的位字段在未来将具有相同的含义)。英特尔 SDM 第 4 卷(2019 年 10 月)的第 2.1 节指定架构 MSR 具有前缀“IA32_”,而所有其他 MSR 都是非架构的。
MSR 的子集和相关的位字段在未来的处理器世代中不会改变,现在被认为是架构 MSR。由于历史原因(从 Pentium 4 处理器开始),这些“架构 MSR”被赋予前缀“IA32_”。
架构 MSR 没有必要使其所有位字段也都是架构的。MSR 198H 是一个建筑 MSR,因为它被命名为IA32_PERF_STATUS
。根据其架构规范,位 15:0 具有一定意义,而 MSR 的其余部分被保留。如果架构 MSR 中有非架构位字段,则在手册中的单独条目中定义,并且为同一 MSR 指定一个不以“IA32_”为前缀的名称。在这种情况下,非架构位字段在名称下定义MSR_PERF_STATUS
。不保证在任何其他处理器中都支持这些位字段(具有相同的含义)。
此命名约定是在支持某些架构 MSR 后引入的。这些 MSR 的名称可能与此约定不同。手册中提供了当前名称(根据命名约定)和以前的名称。后来的 MSR 只有遵循约定的名称。
MSR 仅针对特定供应商(在本例中为英特尔)具有架构性。上述命名约定仅遵循英特尔。AMD 处理器上的架构 MSR 没有前缀。因此,在这种情况下,术语“架构”应该在供应商级别而不是 ISA 级别来理解。
当 MSR 首次在 Pentium 处理器中引入时,它们被称为特定型号,因为英特尔不想承诺让任何或所有未来的 x86 英特尔处理器都支持它们。从 Pentium 4 开始,Intel 决定制作 MSR 架构的子集,并提出了在这些 MSR 前面加上“IA32_”前缀的命名约定,这使得程序员更容易通过查看 MSR 的名称来确定 MSR 是否是架构的. 虽然称它们为“特定于模型”在技术上不再准确,但它坚持了下来。