【发布时间】:2012-02-09 11:00:54
【问题描述】:
我想在用户空间进程中将内存范围设置为不可缓存(Linux、x86-86)。 This question 很接近,但只提到了与物理内存一起工作的 MTRR 寄存器。我想使用 PAT 表来做到这一点,因为它们提供了更细粒度的控制,它们允许逐页将虚拟内存设置为不可缓存。
Linux 文档Documentation/x86/pat.txt 建议应该有一些带有mmap 和SYNC 标志的东西,但我在实践中找不到如何做到这一点。理想情况下,我想使用诸如mprotect(address, range, O_UNCACHABLE) 之类的电话。
【问题讨论】:
-
madvise/mlock足够了吗? -
不,看起来这些只影响虚拟映射(无论页面是在 RAM 中还是在磁盘上),但它们似乎不影响缓存...
-
为什么要使虚拟页面不可缓存?在正常情况下,您仅将未缓存的内存用于设备映射的 IO 或内存。这就是接口仅提供对物理内存的访问的原因。关闭缓存很可能是个坏主意。 x86 有特殊说明来暗示不太可能重用并且不需要缓存。这应该足以调整性能。如果您知道自己在做什么并且确实需要关闭缓存,您可以编写一个内核模块来自己提供用户级界面。但这真的是你想做的吗?
-
这是一个研究项目(如果想法有用,最终目标是提出硬件修改)。如果初始验证可以在真实硬件上完成,那总是可取的,因为替代方案是使用比硬件慢一百万倍的架构模拟器......
-
非 x86 超级用户:stackoverflow.com/questions/885658/…