Linux 通过/proc/mtrr禁用缓存

Linux 通过/proc/mtrr禁用缓存,linux,cpu-cache,Linux,Cpu Cache,当我发出这个命令的时候 sudo sh -c "echo \"base=0x110000 size=0xa000 type=uncachable\" >| /proc/mtrr" /proc/mtrr没有更改,但我希望它添加一个新条目 它使用以下命令: sudo sh -c "echo \"base=0x110000 size=0x10000 type=uncachable\" >| /proc/mtrr" 它添加了以下条目: reg05: base=0x000110000 (

当我发出这个命令的时候

sudo sh -c "echo \"base=0x110000 size=0xa000 type=uncachable\" >| /proc/mtrr"
/proc/mtrr没有更改,但我希望它添加一个新条目

它使用以下命令:

sudo sh -c "echo \"base=0x110000 size=0x10000 type=uncachable\" >| /proc/mtrr"
它添加了以下条目:

reg05: base=0x000110000 (    1MB), size=   64KB, count=1: uncachable
因此,我假设size参数在某些方面受到限制。有这样的限制吗?是否可以将任意内存区域设置为“不可缓存”

我的原始(启动后)/proc/mtrr如下所示:

reg00: base=0x000000000 (    0MB), size= 1024MB, count=1: write-back
reg01: base=0x040000000 ( 1024MB), size=  512MB, count=1: write-back
reg02: base=0x05f700000 ( 1527MB), size=    1MB, count=1: uncachable
reg03: base=0x05f800000 ( 1528MB), size=    8MB, count=1: uncachable
reg04: base=0x0c0000000 ( 3072MB), size=  256MB, count=1: write-combining
我在奔腾m上使用Linux 2.6.32-41-generic#89 Ubuntu SMP。参考:


背景:为了进行计时实验,我想禁用某个进程内存区域的cpu缓存。

我认为这不会像你想象的那样。。。MTRR更改一系列物理内存的属性。该范围如何映射到映射到任何特定进程的虚拟地址空间的页面集取决于内核,除非您出于某种原因正在
mmap()。因此,我认为我必须编写一个内核模块来控制进程内存的物理地址。但是我想最好还是使用/proc/mtrr接口来设置mtrr?
/proc/mtrr
可能是修改mtrr最简单的方法,是的。但要确保你真正理解你所做的改变的后果——这是一条容易导致系统不稳定或更糟的道路。可能有更好的方法来完成您想要的,但是您没有提供很多关于这是什么的细节…我的最终目标是运行一个程序,其中代码(没有库)不会被缓存。我allready完全禁用了CPU缓存(设置CR0寄存器),但发现库需要为实验缓存。我目前的理解是,必须使用mtrr(无论是否使用/proc/mtrr),但这当然可能是错误的。在这种情况下,您可能需要确保代码段锁定在内存中(因此不会重新定位到其他物理页),弄清楚虚拟范围映射到哪些物理范围,并更改这些物理范围上的属性。从用户空间不容易做到;在内核中更容易做到,但可能仍然不是一个蛋糕行走。。。