x86 CPU的MSR寄存器

MSR(Model Specific Register)是x86架构中的概念,指的是在x86架构处理器中,一系列用于控制CPU运行、功能开关、调试、跟踪程序执行、监测CPU性能等方面的寄存器。

MSR寄存器的雏形开始于Intel 80386和80486处理器,到Intel Pentium处理器的时候,Intel就正式引入RDMSR和WRMSR两个指令用于读和写MSR寄存器,这个时候MSR就算被正式引入。在引入RDMSR和WRMSR指令的同时,也引入了CPUID指令,该指令用于指明具体的CPU芯片中,哪些功能是可用的,或者这些功能对应的MSR寄存器是否存在,软件可以通过CPUID指令查询某些功能是否在当前CPU上是否支持。

每个MSR寄存器都会有一个相应的ID,即MSR Index,或者也叫作MSR寄存器地址,当执行RDMSR或者WRMSR指令的时候,只要提供MSR Index就能让CPU知道目标MSR寄存器。这些MSR寄存器的编号(MSR Index)、名字及其各个数据区域的定义可以在Intel x86架构手册”Intel 64 and IA-32 Architectures Software Developer's Manual"的Volume 4中找到。



MSR顾名思义就是Model Specific,即不同的CPU型号或不同的CPU厂商(Intel和AMD都会做x86架构的处理器),它的MSR寄存器可能是不一样的,它会根据具体的CPU型号的变化而变化,每款新的CPU都有可能引入新的MSR寄存器。事实证明,MSR寄存器的引入用处还是很大的,有一些MSR寄存器甚至是MSR寄存器的部分区域将会被固定下来,并且未来的CPU都会支持这些MSR寄存器或者MSR寄存器的部分区域,这类MSR寄存器就叫做“Architecture MSRs”,Architecture MSR由于历史的原因(Pentium处理器是32位的),它的名字都是以"IA32_"为前缀的,即使是在目前主流的64位x86处理器中也是这样命名。对于Intel的x86 CPU和AMD的x86 CPU而言,它们的MSR寄存器可能会有区别,但是可能因为各种原因,或者为了软件的兼容性,它们的部分MSR寄存器是一样的,如IA32_LSTAR。

另外,对于x86 CPU而言,它不仅仅有MSR寄存器,它还包含了特别多的CSR(Control and Status Register)寄存器,这些寄存器主要是给BIOS/UEFI使用,让其根据具体的主板结构对CPU的工作模式,内部功能控制,CPU之间的互连等进行配置。CSR寄存器是通过类似PCI配置空间访问的方式进行访问的,但是当BIOS/UEFI配置完成后,会将其隐藏起来,所以对于OS而言,它只能访问到MSR寄存器,它根本不知道CSR寄存器的存在。总的来说,MSR寄存器对于BIOS/UEFI和OS都是可见的,而CSR寄存器只对BIOS/UEFI可见,对于OS来说是不可见的。

发布于 2018-11-17

文章被以下专栏收录