RISC-V 中断处理流程

dis*_*ted 1 interrupt irq riscv

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

我查看了互联网上的指令集手册和信息。重点是准确解释标题设置的内容:指令集。在我看来,如何处理中断是所谓的处理器“程序员模型”的问题。它不适合关于指令集的文档,因为部分中断处理没有在指令中表达。显然,跳转到 ISR并不是出现在程序代码中任何地方的指令。指令集手册提供了 saymret和 的描述mstatus,但未能提供整体视图。

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

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.
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*idt 5

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

发生中断时,处理器所做的一切就是

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

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

CSR 库和权限级别在那里,因此完整的实现可以为管理程序/虚拟机、操作系统和应用程序提供良好的支持。对于一个简单的应用程序,比如在嵌入式处理器上,真正需要的只是一个 CSR 银行和一个权限级别。

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

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

如果您想了解更多信息,请从研究 MRET 指令开始,因为这在某种程度上会逆转/取消中断。否则,请查看 RARS 模拟器,您可以在其中实际编写中断处理程序。

  • @CharlesLohr,“mie”IIRC,而不是“mstatus.mie”。`mret` 恢复中断线程的执行(不一定是立即中断的线程),包括将 pc 设置为 mepc 并恢复中断状态以及模式(无论是用户还是主管)。尝试 RARS,编写一个仅执行“mret”的异常处理程序和一些导致异常的用户代码(例如通过“ecall”或“lw”到错误地址)。 (2认同)