我想以编程方式禁用硬件预取。

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/

10-11 21:12