我想以编程方式禁用硬件预取。
从使用硬件实现的预取器在英特尔®酷睿™微体系结构上优化应用程序性能以及 如何在32位英特尔®架构上的硬件和软件预取之间进行选择,我需要更新MSR以禁用硬件预取。
以下是相关片段:
“通过编写用于更改IA32_MISC_ENABLE 寄存器中位的设备驱动程序实用程序,还可以通过编程方式更改DPL预取和L2流预取设置MSR 0x1A0。这种实用程序提供了启用或禁用预取机制的能力,而无需任何服务器停机时间。
IA32_MISC_ENABLE
MSR 0x1A0
下表显示了中的位,这些位IA32_MISC_ENABLE MSR必须更改才能控制DPL和L2流预取:
IA32_MISC_ENABLE MSR
DPL
Prefetcher Type MSR (0x1A0) Bit Value DPL (Hardware Prefetch) Bit 9 0 = Enable 1 = Disable L2 Streamer (Adjacent Cache Line Prefetch) Bit 19 0 = Enable 1 = Disable"
我尝试使用http://etallen.com/msr.html,但这没有用。我也尝试直接使用wrmsrin asm/msr.h,但存在段错误。我尝试在内核模块中执行此操作……并杀死了计算机。
wrmsr
asm/msr.h
顺便说一句-我正在使用内核2.6.18-92.el5,它已MSR链接到内核中:
MSR
$ grep -i msr /boot/config-$(uname -r) CONFIG_X86_MSR=y ...
从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);