我想在用户空间进程中将一系列内存设置为不可缓存(Linux,x86-86)。 This question接近,但只提到与物理内存一起工作的MTRR寄存器。我想使用PAT表来实现这一点,因为它们提供了更细粒度的控制,它们允许虚拟内存在逐页的基础上设置为不可缓存。
Linux文档Documentation/x86/pat.txt表明应该有mmap
和SYNC
标志,但我在实践中找不到如何做到这一点。理想情况下,我想使用mprotect(address, range, O_UNCACHABLE)
等电话。
答案 0 :(得分:3)
我建议编写内核模块,为用户级进程提供必要的接口。在内核模块中,您可以使用set_memory_uc来控制页面属性。
关于模拟器:除非你在门级进行模拟,否则它应该慢一到几千倍 - 不是一百万倍。不要忘记考虑编写内核模块所花费的时间。如果您需要几周的时间来编写和调试模块,那么最好使用模拟器进行一次性实验。
答案 1 :(得分:0)
根据各种开发人员在ARM平台上的问题,代码将是:
fd = open("/dev/mem", O_RDWR|O_SYNC);
uptr = mmap(addr, length, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED, fd, off);
REF: