RISC-V 中的 Wait For Interrupt 指令 (wfi)
Note:
以下内容主要来自 RISC-V 特权手册相关部分
------→ 后一些个人注解,使得原文的含义更容易理解
希望对你有所帮助
wfi 详细内容
Wait for Interrupt
(WFI)指令通知硬件可以暂停当前的 hart,直到有中断需要服务 。[执行 WFI 指令也可以用于通知硬件平台,适当的中断应该优先路由到这个 hart]。WFI 在所有特权模式下都可用,并且可选地对 U-mode 可用。
------→ WFI 可以认为就是低功耗设计,让 hart 在等待的时候可以进入低功耗状态
当 mstatus
中的 TW=1
时,执行此指令可能会引发非法指令异常,具体描述见特权手册 3.1.6.6 节中关于 TW 位的描述。
------→ 这意味着高特权级有办法捕捉低特权级的 WFI 指令,比如 VM 的 wfi 可以被 Hypervisor 捕捉

如果一个已使能的中断存在,或者在 hart 被暂停时变为存在,下一条指令将会触发中断陷阱,即执行将从中断处理程序继续,且 mepc = pc + 4
。
下一条指令会触发中断陷阱,以便从中断处理程序返回时,能够执行 WFI 指令之后的代码。
------→ 也就是说执行 wfi 之后,接收到到中断信号唤醒后先处理中断,返回到 wfi 的下一条指令继续执行
实现允许在任何情况下恢复执行,即使一个已使能的中断尚未变为挂起。因此,一个合法的实现是将 WFI 指令简单地实现为一个 NOP(无操作)。
如果实现没有在执行该指令时暂停 hart,那么中断将在包含 wfi 的空闲循环中的某条指令上被触发,且从处理程序简单返回后,空闲循环将继续执行。
------→ 也就是说 wfi 是可以实现为 nop,一个空操作,即什么也不做,对软件是不可见的
------→ 软件往往会写 loop { wfi, ... } ,不管 wfi 指令的实现是否真的会让 hart 暂停
WFI 指令在中断被禁用时也可以执行 。WFI 的操作必须不受 mstatus
中全局中断位(MIE 和 SIE)和委托寄存器 mideleg
的影响 (即,如果一个 locally enabled 的中断变为挂起,hart 必须恢复执行,即使该中断已被委托给低权限模式),但应该遵循特定中断使能(例如,MTIE)的设置(即,如果中断挂起但未特定使能,实施应避免恢复 hart)。
WFI 还要求无论在任何权限级别,locally enabled 的挂起中断都能使 hart 恢复执行,忽略每个权限级别的全局中断使能。
------→ 如何理解 locally enabled 的中断?我个人理解是执行 wfi 时的特权级,对应寄存器 mie/sie/vsie,只要这里的寄存器使能,比如,mie.MTIE 使能,其他中断未使能,当前 wfi 在 M-mode 执行,那么只有 machine interrupt 能够让这个 hart resume。
如果导致 hart 恢复执行的事件没有触发中断,执行将从 pc + 4
处恢复,且软件必须决定采取何种操作,包括在没有可处理事件的情况下循环回去重新执行 WFI。
------→ 这也就意味着,软件需要检查中断信息是否是自己需要的,不是则需要循环回去,继续执行 wfi,比如 hart 恢复的事件是一个软件中断,如果一个其他中断唤醒了 hart,可以处理一下该中断,当没有可处理事件,继续执行 wfi,直到收到想要的软件中断,可以跳出包含 wfi 的循环
通过允许在禁用中断时唤醒,可以调用一个备用的中断处理程序入口点,该入口点不需要保存当前上下文,因为当前上下文可以在执行 WFI 之前保存或丢弃。
------→ 这句话我不是很确定,应该是看具体的硬件设计?和上面的一般情况不同。
由于实现可以将 WFI 实现为 NOP,软件必须在 WFI 后的代码中显式检查任何相关的挂起但被禁用的中断,并且如果没有检测到合适的中断,应当循环回 WFI。可以通过查询
mip
或sip
寄存器来确定在机器模式或监督模式下是否存在任何中断。------→ 这句话应该是和上面那句搭配的,对于允许禁用中断唤醒的情况,这种情况下硬件不会触发,需要软件显示检查
WFI 的操作不受委托寄存器设置的影响。
WFI 的定义使得实现可以在遇到 WFI 时立即或经过一段时间进入更高权限模式,例如启动一个机器模式过渡到低功耗状态。
相同的 "wait-for-event" 模板也可能会用于未来的扩展,例如等待内存位置变化或消息到达。
RISC-V wfi 指令总结
- WFI 在所有特权模式下都可用
- 一个合法的实现是将 WFI 指令简单地实现为一个 NOP(无操作)
- WFI 不受
mstatus
中全局中断位(MIE 和 SIE)和委托寄存器mideleg
的影响由特定中断使能,比如 mie.MTIE
其中最后一条应该是操作系统程序员比较关心的