在查看gcc文档时,我发现了内置函数__builtin___clear_cache
。
— 内置函数:void __builtin___clear_cache (char *begin, char* end) 此函数用于清除处理器指令高速缓存中begin(含)和end(不含)之间的存储区域。某些目标需要在修改包含代码的内存后刷新指令高速缓存,以获得确定性行为。
如果目标不需要刷新指令高速缓存,则__builtin___clear_cache无效果。否则,将内联发出指令以清除指令高速缓存,或调用libgcc中的__clear_cache函数。
我觉得这很有趣,但也让人惊讶。在许多情况下,当前堆栈的大量指令存储在L1高速缓存(指令高速缓存)中。因此乍一看,这个内置函数似乎会显著破坏我们程序的流程,因为它会清除堆栈上的下一个指令。
这个指令是否还会重新填充在L1缓存中的堆栈部分呢?
这似乎不太可能。如果不会重新填充,则用户需要使用正确的begin
和end
参数,以避免破坏我们的进程。在实践中,人们该如何找到正确的begin
和end
参数呢?