FENCE.I 和 FENCE rw,rw 一样吗?
不是。FENCE 约束数据内存和 I/O 操作的可见顺序;FENCE.I 同步指令获取路径与先前数据存储。
同步当前 hart 的数据存储与后续指令获取,使 FENCE.I 之后的取指能看到之前已可见的代码写入。
FENCE.I 是 Zifencei 扩展的 MISC-MEM 指令(opcode=0001111, funct3=001),语法没有显式操作数。它同步当前 hart 的指令流和数据流:在 FENCE.I 之后发起的指令获取,必须能观察到该 hart 在 FENCE.I 之前已经可见的数据存储。它常用于自修改代码、动态代码生成和 JIT 代码发布。FENCE.I 不是普通数据内存 FENCE,也不是 TLB 失效或具体 instruction-cache flush;跨 hart 代码更新还需要让其它 hart 执行相应同步。
展示 Zifencei 的固定 MISC-MEM 编码,以及本 hart 上先前数据存储与后续指令获取之间的 ISA 可见同步关系。
该动画只展示 Zifencei 的 ISA 可见本 hart 同步语义;不模拟具体 I-cache、D-cache、pipeline、分支预测、取指时延或跨 hart shootdown 协议。
FENCE.I 是当前 hart 的“代码写入后再取指”同步点:先让数据存储写出新指令,再用 FENCE.I 保证后续取指路径看到这些已可见写入。
结合 «fence.i # sync instruction fetch with prior data stores» 等实际代码理解该场景。
结合 «fence.i # sync instruction fetch with prior data stores» 等实际代码理解该场景。
结合 «fence.i # sync instruction fetch with prior data stores» 等实际代码理解该场景。
不是。FENCE 约束数据内存和 I/O 操作的可见顺序;FENCE.I 同步指令获取路径与先前数据存储。
不会。官方语义是当前 hart 的同步;多 hart 修改代码需要让其它 hart 也执行相应同步序列。
不要这样理解。规范定义的是指令/数据流同步语义,不规定具体 cache 结构、flush 算法或时延。