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

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

指令手册R-type

Svinval 前置排序指令:保证当前 hart 已可见的先前存储先于后续 SINVAL/HINVAL 失效。

指令语法

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

指令行为说明

SFENCE.W.INVAL 是 Svinval 拆分失效序列的前置排序边界,没有显式汇编操作数。它保证当前 hart 已可见的先前存储先于该 hart 后续执行的 SINVAL.VMA、HINVAL.VVMA 或 HINVAL.GVMA。它不执行 VA/ASID 范围失效,也不是普通数据 cache flush;典型序列是 SFENCE.W.INVAL -> 一条或多条 SINVAL/HINVAL -> SFENCE.INVAL.IR。

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

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

无显式操作数
sfence.w.inval
执行环境Svinval该排序边界作用于当前 hart 的失效序列。
31..20
19..15
14..12
11..7
6..0
000110000000
funct12
00000
rs1=x0
000
funct3
00000
rd=x0
1110011
SYSTEM
Svinval 序列状态
instruction
0x18000073
opcode
1110011 -> SYSTEM
funct12
000110000000 -> SFENCE.W.INVAL
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.W.INVAL 是 Svinval 序列的“前括号”:它把已经对当前 hart 可见的页表相关存储排在后续失效操作之前。

该指令没有显式汇编操作数,编码中 rs1 和 rd 固定为 x0。
它建立“先前可见存储 -> 后续 SINVAL/HINVAL”的排序边界。
它本身不选择 VA/ASID 范围,不模拟 cache 或 shootdown 协议。

常见使用场景

内存管理

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

地址转换失效

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

地址转换缓存失效

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

Svinval 序列

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

使用前检查清单

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

容易混淆 / 常见误区

在 U-mode 执行会触发 illegal-instruction;在 VU-mode 执行会触发 virtual-instruction。
不受 mstatus.TVM 和 hstatus.VTVM 影响;允许在 S-mode 和 VS-mode 中使用。
该指令没有显式汇编操作数;编码中的 rs1 和 rd 字段固定为 x0。
它把先前可见的存储排在后续 SINVAL/HINVAL 失效之前;它本身不选择 VA/ASID 失效范围。
不要把它当作数据 cache 刷新或 OS shootdown 协议。

常见问题

SFENCE.W.INVAL 会执行失效吗?

它是排序边界,不是按 VA/ASID 选择的失效指令;失效由 SINVAL.VMA 或 HINVAL.* 执行。

为什么它没有操作数?

它描述的是序列排序边界,不是某个地址或 ASID 范围;编码中的相关寄存器字段固定为 x0。