修改代码后为什么还需要它?
数据存储可见并不自动保证指令获取路径看到新指令,FENCE.I 提供本 hart 的同步点。
同步指令和数据流,确保后续指令获取能看到之前的数据存储(用于自修改代码和JIT编译)
FENCE.I指令属于Zifencei扩展(opcode=MISC-MEM, funct3=001)。它用于同步指令流和数据流:在FENCE.I执行之后发起的指令获取,保证能看到在此FENCE.I之前的任何针对指令区域的数据存储。这是实现自修改代码、JIT编译器、动态代码生成等必须的同步原语。不同于FENCE(内存数据排序),FENCE.I专用作指令-数据串行化。在没有Zifencei支持的系统中执行FENCE.I将引发非法指令异常。
FENCE.I 同步当前 hart 的数据存储与后续指令获取,使自修改代码或动态生成代码在本 hart 上可被后续取指看到。
结合 «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 提供本 hart 的同步点。
不会。地址转换同步使用 SFENCE.VMA 或相关特权失效序列。