6

我正在 ARM Linux 上编写一个 JIT,它执行包含自修改代码的指令集。该指令集没有任何缓存刷新指令(在这方面类似于 x86)。

如果我将一些代码写入页面然后mprotect在该页面上调用,这足以使指令缓存无效吗?或者我是否还需要cacheflush在这些页面上使用系统调用?

4

3 回答 3

3

您希望 mmap/mprotect 系统调用会建立立即更新的映射,并且无需进一步交互即可使用指定的内存范围。我看到内核确实刷新了 mprotect 上的缓存。在这种情况下,不需要缓存刷新。

但是,我还看到某些版本的 libc 确实调用cacheflushafter mprotect,这意味着某些环境需要刷新(或以前)缓存。我猜这是一个错误的解决方法。

您可以随时添加对 cacheflush 的调用;虽然它是额外的代码,但它不应该是有害的——最坏的情况是,缓存已经被刷新了。你总是可以写一个快速测试,看看会发生什么......

于 2011-02-14T10:37:17.810 回答
1

In Linux specifically, mprotect DOES cacheflush all caches since at least version 2.6.39 (and even before that for sure). You can see that in the code: https://elixir.bootlin.com/linux/v2.6.39.4/source/mm/mprotect.c#L122 .

If you are writing a POSIX portable code, I would call cacheflush as the standard C library is not demanding such behavior from the kernel, nor from the implementation.

Edit: You should also be carefull and check what flush_cache_range does in the specific architecture you are implementing for, as in some architecture (like ARM64) this function does nothing...

于 2021-08-01T12:51:06.723 回答
-1

我相信您不必显式刷新缓存。

这是哪个处理器?ARMv5?ARMv7?

于 2010-05-06T01:01:34.433 回答