MSR(Model Specific Register)是 X86 架构中的概念,指的是在 X86 架构处理器中,一系列用于控制 CPU 运行、功能开关、调试、跟踪程序执行、监测 CPU 性能等方面的寄存器。
我们可以使用 rdmsr
读取 msr 寄存器,用 wrmsr
来写入寄存器,我们需要在 ecx
中写入 msr index
,然后在 edx:eax
中读出或写入寄存器的值,如下所示:
uint64_t read_msr(uint32_t msr) {
uint32_t hi, lo, ans;
asm volatile("rdmsr" : "=a"(lo), "=d"(hi) : "c"(msr));
ans = ((uint64_t) hi << 32) | lo;
return ans;
}
void write_msr(uint32_t msr, uint32_t lo, uint32_t hi) {
asm volatile("wrmsr" : : "a"(lo), "d"(hi), "c"(msr));
}
需要注意的是,MSR 并不是唯一的一种“系统寄存器”(就像在 ARM 或者 RISCV 中出现的那样),事实上在 X86 中还有 X86 CR (Control Register)、X86 Flags(标志寄存器)和 DR (Debug Register) 等多种非通用的系统寄存器。MSR 的特点在于它是“Model Specific”的,即对于特定的架构,会存在特定的 MSR ,是比较灵活的系统寄存器。这在它的使用方式中也有体现,它是通过索引而非寄存器助记符来使用的,因为索引是动态的,而助记符是写死的。
此外,需要注意,MSR 在 ring3 并不能读写,这保证了一定的安全性。