RISC-V中断处理流程

8

我正在寻找有关RISC-V处理器如何处理中断请求的信息。

我查阅了指令集手册和互联网上的信息。这些信息主要解释了指令集,而对于处理中断的方式,它们通常被称为“程序员模型”。由于中断处理的某些部分不是通过指令来表达的,因此它们不太适用于关于指令集的文档中。明显地,在程序代码中没有任何地方出现跳转到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 架构的信息。

1个回答

12

从根本上讲,处理器具有一些额外的寄存器,称为控制和状态寄存器(Control & Status Registers,简称 CSRs),用于保存一些关键状态,例如中断 PC、中断特权级别和中断原因等。此外,CSRs 还保持中断配置,其中一部分状态是中断向量表的地址,以及当前特权级别等,例如是否运行在 32 位模式或更大模式下。

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

  • 将中断的 PC 捕获到一个 CSR 中--名为 mepc
  • 将当前特权级别捕获到一个 CSR 中
  • 设置中断原因 CSR--称为 mcause
  • 如果异常是由于页面错误,则 mtval 保存故障地址
  • 关闭中断--mie
  • 在被称为中断向量表的 CSR 中查找中断处理程序
  • 并传输控制(设置 pc)到 ISR
在RISC V中,特权规范中的可选项数量使得事情变得相当复杂。其中包括3个CSR(CSR名称的首字母不同)银行 - 与允许的3个特权级别U、S、M loosly相关 - 其中大部分都是可选的(只有M是必需的)。 (例如,64位或更大(128),以及能够在32位模式下运行,多个处理器,浮点等也是可选的...)
CSR银行和特权级别存在的目的是为了让完整实现能够为超级管理程序/虚拟机、操作系统和应用程序提供良好支持。对于一个简单的应用程序,比如嵌入式处理器上的应用,只需要一个CSR银行和一个特权级别。

如果你熟悉MIPS中的中断处理,那么你会发现RISC V有些相似但要复杂得多。然而,从根本上讲,这些处理器使用额外的寄存器(在MIPS中它们在“协处理器0”中)而不是堆栈来存储被打断的状态。而MIPS专用了两个通用处理器寄存器(整数$k0$k1)用于中断处理,RISC V则没有。然而,与MIPS不同,RISC V提供了另一个CSR供中断处理程序使用——称为mscratch,它可以像$k0一样暂时保存被打断线程的普通寄存器值,使ISR正常运行;或者因为它是受保护的,可以将其设置为指向当前正在运行的线程控制块的指针,其中可以保存被打断线程的CPU寄存器。

RARS模拟器提供了两种模式,U和M,并具有M组CSRs,这允许您编写一个中断处理程序作为小型操作系统以服务应用程序。

如果您想获取更多信息,请从学习MRET指令开始,因为这会在某种程度上颠倒/撤消中断。否则,请查看RARS模拟器,您可以在其中编写中断处理程序。


当您说处理器关闭中断时,这里指的是哪个“mie”? 是 mstatusmie 还是 mie CSR? 另外,您介意写出 mret 的功能吗? - Charles Lohr
1
@CharlesLohr,如果我没记错的话,应该是mie而不是mstatus.miemret用于恢复被中断的线程的执行(不一定是立即被中断的线程),包括将pc设置为mepc并恢复中断状态以及模式(用户或超级用户)。尝试使用RARS编写一个异常处理程序,其中仅执行mret和一些用户代码,以引发异常(例如通过ecall或对错误地址的lw操作)。 - Erik Eidt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接