我想以编程方式禁用硬件预取。
从Optimizing Application Performance on Intel® Core™ Microarchitecture Using Hardware-Implemented Prefetchers和
How to Choose between Hardware and Software Prefetch on 32-Bit Intel® Architecture,
我需要更新MSR以禁用硬件预取。
以下是相关片段:
下表显示了IA32_MISC_ENABLE MSR
中必须更改的位,以控制DPL
和L2流预取:
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,但这没有用。
我也尝试过直接在
wrmsr
中使用asm/msr.h
,但是存在段错误。我尝试在内核模块中执行此操作……并杀死了计算机。
顺便说一句-我正在使用内核2.6.18-92.el5,它在内核中链接了
MSR
:$ grep -i msr /boot/config-$(uname -r)
CONFIG_X86_MSR=y
...
最佳答案
从英特尔引用中:
该指令必须在特权级别0或实地址模式下执行;否则,将生成一般保护异常#GP(0)。在ECX中指定保留的或未实现的MSR地址也会导致一般保护异常。
...
应该使用CPUID指令来确定是否支持MSR(EDX [5] = 1)
在使用此指令之前。
因此,您的故障可能与不支持MSR或使用错误MSR地址的CPU有关。
在内核源代码中有许多使用MSR的示例:
在内核源代码中,对于单个cpu,它演示了在arch/i386/kernel/cpu/intel.c中通过以下功能禁用Xeon的预取:
静态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);
关于linux - 如何以编程方式禁用硬件预取?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/784041/