首页/指令库/SFENCE-INVAL-IR
SFENCE.INVAL.IR

RISC-V SFENCE.INVAL.IR 指令详解

指令手册R-type

Svinval 后置排序指令:保证之前的 SINVAL/HINVAL 失效先于后续隐式页表引用。

指令语法

sfence.inval.ir
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数寄存器。
源寄存器 rs2:第二个操作数寄存器。
PrivilegedSvinval内存管理

指令行为说明

SFENCE.INVAL.IR 是 Svinval 拆分失效序列的后置排序边界,没有显式汇编操作数。它保证当前 hart 之前执行的 SINVAL.VMA、HINVAL.VVMA 或 HINVAL.GVMA 失效操作先于该 hart 后续对内存管理数据结构的隐式引用。它不选择 VA/ASID 失效范围,也不是指令 cache 刷新;典型序列是 SFENCE.W.INVAL -> 一条或多条 SINVAL/HINVAL -> SFENCE.INVAL.IR。

SFENCE.INVAL.IR 指令解析与 Svinval 动画

展示固定 SYSTEM 编码和 Svinval 序列中的排序边界;该指令没有显式汇编操作数。

无显式操作数
sfence.inval.ir
执行环境Svinval该排序边界作用于当前 hart 的失效序列。
31..20
19..15
14..12
11..7
6..0
000110000001
funct12
00000
rs1=x0
000
funct3
00000
rd=x0
1110011
SYSTEM
Svinval 序列状态
instruction
0x18100073
opcode
1110011 -> SYSTEM
funct12
000110000001 -> SFENCE.INVAL.IR
operands
rd=x0, rs1=x0, no assembly operands
sequence
SFENCE.W.INVAL -> SINVAL/HINVAL... -> SFENCE.INVAL.IR
ordering
之前 SINVAL/HINVAL -> 后续隐式页表引用

该动画只展示特权架构定义的本 hart 失效/排序关系;不模拟 TLB 结构、cache 刷新、页表遍历耗时、IPI 或 OS shootdown 协议。

快速理解与检索要点

SFENCE.INVAL.IR 是 Svinval 序列的“后括号”:它把先前完成的失效排在之后的隐式页表引用之前。

该指令没有显式汇编操作数,编码中 rs1 和 rd 固定为 x0。
它建立“先前 SINVAL/HINVAL -> 后续隐式页表引用”的排序边界。
它不是 FENCE.I,也不表示普通 instruction-cache flush。

常见使用场景

内存管理

结合 «sfence.inval.ir» 等实际代码理解该场景。

地址转换失效

结合 «sfence.inval.ir» 等实际代码理解该场景。

地址转换缓存失效

结合 «sfence.inval.ir» 等实际代码理解该场景。

Svinval 序列

结合 «sfence.inval.ir» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 R-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

在 U-mode 执行会触发 illegal-instruction;在 VU-mode 执行会触发 virtual-instruction。
不受 mstatus.TVM 和 hstatus.VTVM 影响;允许在 S-mode 和 VS-mode 中使用。
该指令没有显式汇编操作数;编码中的 rs1 和 rd 字段固定为 x0。
它把先前的 SINVAL/HINVAL 失效排在后续隐式页表引用之前。
不要把它当作 FENCE.I、指令 cache 刷新或具体页表遍历过程。

常见问题

SFENCE.INVAL.IR 和 FENCE.I 一样吗?

不是。SFENCE.INVAL.IR 处理 Svinval 失效后的隐式页表引用排序;FENCE.I 属于不同的指令获取同步语义。

它为什么放在序列末尾?

它是后置排序边界,用来保证之前的 SINVAL/HINVAL 失效先于后续隐式内存管理引用。