Car*_*los 45 linux kernel prefetch
我想以编程方式禁用硬件预取.
从使用硬件实现的预取程序优化英特尔®酷睿™微体系结构上的应用程序性能以及 如何在32位英特尔®架构上选择硬件和软件预取,我需要更新MSR以禁用硬件预取.
这是一个相关的片段:
"DPL预取和L2流预取设置也可以通过编写设备驱动程序实用程序来更改
IA32_MISC_ENABLE寄存器中的位来以编程方式进行更改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"
Run Code Online (Sandbox Code Playgroud)
我尝试使用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
...
Run Code Online (Sandbox Code Playgroud)
Car*_*los 26
您可以使用msr-tools启用或禁用硬件预取程序 http://www.kernel.org/pub/linux/utils/cpu/msr-tools/.
以下启用硬件预取器(通过取消设置位9):
[root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2089
[root@... msr-tools-1.2]# ./rdmsr 0x1a0
60628e2089
Run Code Online (Sandbox Code Playgroud)
以下命令禁用硬件预取器(通过启用第9位):
[root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2289
[root@... msr-tools-1.2]# ./rdmsr 0x1a0
60628e2289
Run Code Online (Sandbox Code Playgroud)
以编程方式,您可以通过打开/dev/cpu/<cpunumber>/msr并使用pwrite在0x1a0偏移量处写入msr"文件"来以root身份执行此操作.
Chr*_*ris 11
来自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);