RISC-V 中断处理流程

RISC-V Interrupt Handling Flow

我正在寻找 RISC-V 处理器如何处理中断请求。

我查看了指令集手册和互联网上的信息。重点是准确解释标题设置的内容:指令集。在我看来,如何处理中断是一个所谓处理器的"programmer's model"的问题。它显然不适合有关指令集的文档,因为部分中断处理未在指令中表达。显然,跳入 ISR 是 而不是 出现在程序代码中任何位置的指令。指令集手册提供了 mretmstatus 的描述,但未能提供整体视图。

对于一个假设的架构,中断处理可能是这样描述的:

If the IRQ line is high and the I-bit in the status register is set,
the processor executes the following steps atomically:

 - Push the PC of the next instruction onto the stack.
 - Push the status register onto the stack.
 - Clear the I-bit in the status register.
 - The PC is set to the location specified in the INTHNDLR register.

这就是我正在寻找的关于 RISC-V 架构的信息。

从根本上说,处理器有一些额外的寄存器,称为控制和状态寄存器,又名 CSR,用于保存一些关键状态,例如中断的 pc、中断的特权级别和中断的原因,等等。此外,CSRs还持有中断配置,其中一个状态是中断向量的地址table,以及当前的特权级别等等,比如是否运行宁在 32 位模式或更大。

一旦中断,处理器所做的就是

  • 将中断的 pc 捕获到 CSR 中 — 称为 mepc
  • 将当前权限级别捕获到 CSR 中
  • 设置中断原因 CSR — 调用 mcause
  • 如果异常是由于页面错误引起的,那么 mtval 保存错误地址
  • 关闭中断 — mie
  • 在 CSR 指定的向量 table 中查找中断处理程序 — 称为 mtvec
  • 并将控制权(设置 pc)移交给 ISR

RISC V 中显着复杂化的是特权规范中可选事物的数量。其中有 3 个 CSR 库(CSR 名称的第一个字母不同)——松散地与允许的 3 个特权级别 U、S、M 相关——其中大部分是可选的(实际上只有 M 是必需的)。 (也可选,例如,是 64 位或更大(128),然后 运行 在 32 位模式下的能力,多处理器,浮点等...)

存在 CSR 库和权限级别,因此完整的实现可以为 hypervisors/virtual 机器、操作系统和应用程序提供良好的支持。对于一个简单的应用程序,比如说,在嵌入式处理器上,只需要一个 CSR 库和一个特权级别。

如果您熟悉 MIPS 中断处理,您会发现 RISC V 有点熟悉,但要复杂得多。然而,从根本上说,这些处理器使用额外的寄存器(在 MIPS 上它们在“协处理器 0”中)而不是堆栈来存储中断状态。 MIPS 专用 2 个通用处理器寄存器(整数 $k0$k1)来处理中断,而 RISC V 则没有。但是,与 MIPS 不同的是,RISC V 为中断处理程序提供了一个额外的 CSR,称为 mscratch,可用于(如 $k0)临时保存来自(被中断线程的)常规寄存器的值) 以便 ISR 运行,或者,因为它受到保护,它可以设置为指向当前 运行ning 线程控制块的指针,其中可以保存中断线程的 CPU 寄存器。

RARS 模拟器提供两种模式,U 和 M,并具有 M 组 CSR,它允许您将中断处理程序编写为微型操作系统来为应用程序提供服务。

如果您想了解更多信息,请从研究 MRET 指令开始,因为这有点 reverses/undoes 中断。否则,请查看 RARS 模拟器,您可以在其中实际编写中断处理程序。