59 个稳定版本 (21 个主要版本)
新 24.0.0 | 2024 年 8 月 20 日 |
---|---|
23.0.2 | 2024 年 8 月 12 日 |
23.0.1 | 2024 年 7 月 22 日 |
22.0.0 | 2024 年 6 月 20 日 |
2.0.0 | 2022 年 11 月 21 日 |
#497 in WebAssembly
382,590 每月下载量
用于 483 个 Crates(直接使用 6 个)
17KB
152 行
此 crate 为 JIT 编写者提供指令缓存维护工具。
在自修改代码中,例如在编写 JIT 时,在将代码标记为准备执行时必须特别注意。在完全一致的架构(X86,S390X)中,数据缓存(D-Cache)和指令缓存(I-Cache)始终同步。但是,对于像 AArch64 这样这些缓存不彼此一致的架构,这并不保证。
在编写新代码时,可能存在相同的地址的 I-cache 条目,导致处理器执行缓存中的内容而不是新代码。
请参阅包含上述内容的精彩解释的ARM 社区 - 缓存和自修改代码博客文章。(它引用了 AArch32,但对该问题有高级概述)。
使用方法
您应该在写入新代码的任何页面上调用 [clear_cache]。您可以在从写入页面到代码执行的那一刻的代码中的任何位置执行此操作。
如果您在多线程环境中运行,还需要调用 [pipeline_flush_mt] 以确保管道中没有无效的指令。
对于单线程程序,您可以省略[pipeline_flush_mt],否则您需要按照顺序调用[clean_cache]和[pipeline_flush_mt]。
示例
#
#
#
// Invalidate the cache for all the newly written pages where we wrote our new code.
for page in newly_written_pages {
clear_cache(page.addr, page.len)?;
}
// Once those are invalidated we also need to flush the pipeline
pipeline_flush_mt()?;
// We can now safely execute our new code.
run_code();
Warning: In order to correctly use this interface you should always call [clear_cache]. A followup call to [pipeline_flush_mt] is required if you are running in a multi-threaded environment.
依赖项
~0.1–8.5MB
~59K SLoC