我正在 ARM Linux 上编写一个 JIT,它执行一个包含自修改代码的指令集。该指令集没有任何缓存刷新指令(在这方面类似于 x86)。
如果我将一些代码写入页面,然后在该页面上调用 mprotect
,是否足以使指令缓存失效?还是我还需要在这些页面上使用 cacheflush
系统调用?
最佳答案
您希望 mmap/mprotect 系统调用会建立立即更新的映射,并且不需要进一步的交互来使用指定的内存范围。我看到内核确实刷新了 mprotect 上的缓存。在这种情况下,不需要刷新缓存。
但是,我还看到某些版本的 libc 在 mprotect
之后调用了 cacheflush
,这意味着某些环境需要缓存冲洗(或以前)。我猜测这是一个错误的解决方法。
您总是可以添加对 cacheflush 的调用;虽然它是额外的代码,但它不应该有害——最坏的情况是,缓存已经被刷新了。你总是可以编写一个快速测试,看看会发生什么......
关于linux - mprotect 是否刷新 ARM Linux 上的指令缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2777725/