浏览gcc文档时,我偶然发现了内置函数__builtin___clear_cache



我觉得这很有趣,但令人惊讶。在许多情况下,当前堆栈的大量指令存储在L1缓存(指令缓存)中。乍一看,这个内置函数可能会通过抹掉堆栈上的下一条指令来严重破坏程序的流程。

该指令是否还会重新填充L1高速缓存中的堆栈部分?

这似乎不太可能。如果没有,那么我认为用户有责任使用正确的beginend参数,以免破坏我们的流程。在实践中,如何找到合适的beginend

最佳答案

它只是在需要它们的目标处理器上发出一些奇怪的机器指令(x86不需要)。

可以将__builtin___clear_cache视为刷新指令缓存的“便携式”方式(适用于GCC和兼容的编译器)(例如,在某些JIT库中)。



为了安全起见,我会在某些页面范围(例如,使用sysconf(_SC_PAGESIZE) ....获得)上使用该地址,因此通常使用4KB对齐的内存范围(4KB的倍数)。否则,您需要一些特定于目标的技巧来查找缓存行宽...

在Linux上,您可以阅读/proc/cpuinfo并使用cache_alignmentcache_size行来获得更精确的缓存行大小和对齐方式。

顺便说一句,使用__builtin__clear_cache的代码很可能是(出于其他原因)特定于目标计算机的,因此它具有或知道一些计算机参数(并且应包括缓存大小和对齐方式)。

07-24 21:02