我正在ARM Linux上写一个JIT,它执行一个包含自修改代码的指令集。指令集没有任何缓存刷新指令(在这方面类似于x86 )。
如果我写出一些代码到一个页面,然后在该页面上调用mprotect,这是否足以使指令缓存无效?或者,我还需要在这些页面上使用cacheflush系统调用吗?
发布于 2011-02-14 18:37:18
您可能希望mmap/mprotect syscall会建立立即更新的映射,并且不需要进一步的交互即可使用指定的内存范围。我看到内核确实刷新了mprotect上的缓存。在这种情况下,不需要刷新缓存。
然而,我也看到一些版本的libc在mprotect之后调用cacheflush,这意味着一些环境需要刷新缓存(或之前已经刷新)。我猜想这是一个bug的变通方法。
您可以随时添加对cacheflush的调用;虽然这是额外的代码,但它不应该是有害的-在最坏的情况下,缓存已经被刷新了。你总是可以写一个快速的测试,看看会发生什么。
发布于 2021-08-01 12:51:07
特别是在Linux中,mprotect确实会缓存刷新至少2.6.39版本(甚至更早的版本)的所有缓存。您可以在以下代码中看到:https://elixir.bootlin.com/linux/v2.6.39.4/source/mm/mprotect.c#L122。
如果您正在编写POSIX可移植代码,我会调用cacheflush,因为标准C库并不要求内核或实现具有这样的行为。
编辑:你还应该仔细检查flush_cache_range在你正在实现的特定架构中做了什么,就像在一些架构(比如ARM64)中一样,这个函数什么也不做……
发布于 2010-05-06 09:01:34
我相信您不必显式地刷新缓存。
这是哪个处理器?ARMv5?ARMv7?
https://stackoverflow.com/questions/2777725
复制相似问题