从Intel参考: 必须在特权级别0或实地址模式下执行此指令;否则,将生成一般保护异常#GP(0)。在ECX中指定保留的或未实现的MSR地址也会导致一般保护异常。
… 在使用此指令之前,应使用cpuID指令确定是否支持MSR(EDX [5] = 1)。
因此,您的故障可能与不支持MSR或使用错误MSR地址的cpu有关。
在内核源中使用MSR的例子很多:
在内核源中,对于单个cpu,它演示了在arch / i386 / kernel / cpu / intel.c中通过功能禁用Xeon的预取:
static void __cpuinit Intel_errata_workarounds(struct cpuinfo_x86 * c)
rdmsr函数参数是msr号,指向低32位字的指针和指向高32位字的指针。 wrmsr函数的参数是msr号,低32位字值和高32位字值。
多核或smp系统必须将cpu结构作为第一个参数传递: void rdmsr_on_cpu(unsigned int cpu,u32 msr_no,u32 * l,u32 * h); void wrmsr_on_cpu(unsigned int cpu,u32 msr_no,u32 l,u32 h);