Model Specific Registers
跳到导航
跳到搜索
P6系列以后的处理器(包括PentiumPro、Pentium II、III、4和Intel Core)有一组寄存器,允许配置与操作系统相关的内容,如内存类型范围、syscenter/sysexit、本地APIC等。 可以使用RDMSR(读MSR)、WRMSR(写MSR)和RDTSC等特殊指令访问这些MSRs。
访问特定型号寄存器(Model Specific Registers)
RDMSR和WRMSR指令组访问的每个MSR都由一个32位整数标识。 MSR是64位宽的。 你的处理器上是否存在msr由 CPUID 指示。01h:EDX [位5]。
const uint32_t CPUID_FLAG_MSR = 1 << 5;
bool cpuHasMSR()
{
uint32_t a, d; // eax, edx
cpuid(1, &a, &d);
return d & CPUID_FLAG_MSR;
}
void cpuGetMSR(uint32_t msr, uint32_t *lo, uint32_t *hi)
{
asm volatile("rdmsr" : "=a"(*lo), "=d"(*hi) : "c"(msr));
}
void cpuSetMSR(uint32_t msr, uint32_t lo, uint32_t hi)
{
asm volatile("wrmsr" : : "a"(lo), "d"(hi), "c"(msr));
}
访问MSR的其他方式
rdmsr
and wrmsr
是特权指令. 但是,有一些MSR可以使用特殊指令从非特权代码访问。 例如, rdtsc
指令是读取时间戳计数器的非特权指令,它实际上位于MSR(索引10h)中。
额外x86_64寄存器
AMD添加了 EFER寄存器,用于控制特定的长模式功能。 此后,它被英特尔采用。
Bit 0 | System Call Extensions (SCE) |
Bits 1-7 | Reserved |
Bit 8 | Long Mode Enable (LME) |
Bit 9 | Reserved |
Bit 10 | Long Mode Active (LMA) |
Bit 11 | No-Execute Enable (NXE) |
Bit 12 | Secure Virtual Machine Enable (SVME) |
Bit 13 | Long Mode Segment Limit Enable (LMSLE) |
Bit 14 | fast FXSAVE/FXSTOR (FFXSR) |
Bit 15 | Translation Cache Extension (TCE) |
Bits 16-63 | Reserved |
到目前为止,最有趣的是SCE位,因为它启用syscall
指令。
另见
文章
外部链接
- http://sandpile.org/x86/msr.htm for documented MSRs
- https://github.com/xen-project/xen/blob/master/xen/include/asm-x86/msr-index.h for MSRs relevant to Xen emulation (including Intel's 0x35)