一尘不染

如何以编程方式禁用硬件预取?

linux

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

使用硬件实现的预取器在英特尔®酷睿™微体系结构上优化应用程序性能以及
如何在32位英特尔®架构上的硬件和软件预取之间进行选择,我需要更新MSR以禁用硬件预取。

以下是相关片段:

“通过编写用于更改IA32_MISC_ENABLE 寄存器中位的设备驱动程序实用程序,还可以通过编程方式更改DPL预取和L2流预取设置MSR 0x1A0。这种实用程序提供了启用或禁用预取机制的能力,而无需任何服务器停机时间。

下表显示了中的位,这些位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,但这没有用。我也尝试直接使用wrmsrin
asm/msr.h,但存在段错误。我尝试在内核模块中执行此操作……并杀死了计算机。

顺便说一句-我正在使用内核2.6.18-92.el5,它已MSR链接到内核中:

$ grep -i msr /boot/config-$(uname -r)
CONFIG_X86_MSR=y
...

阅读 409

收藏
2020-06-02

共1个答案

一尘不染

从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);

2020-06-02