我正在寻找RISC-V处理器如何处理中断请求。
我查看了Internet上的指令集手册和信息。重点在于准确解释标题设置的内容:指令集。在我看来,如何处理中断是一个所谓的处理器“程序员模型”的问题。由于中断处理的某些部分未在指令中表示,因此它显然不适合有关指令集的文档。显然,进入ISR是not一条指令,该指令显示在程序代码中的任何地方。指令集手册提供了mret
和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.
这是我正在寻找的RISC-V体系结构的信息。
根本上,处理器具有一些额外的寄存器,称为控制和状态寄存器(又名CSR),用于保存某些关键状态,例如被中断的pc,被中断的特权级别以及中断的原因等。此外,CSR保留中断配置,其状态之一是中断向量表的地址以及当前特权级别等,例如其是否以32位模式或更高版本运行。
在中断后,处理器将执行的所有操作都是
mepc
mcause
mtval
保留错误地址mie
mtvec
RISC V中使事情变得非常复杂的是特权规范中的可选事物的数量。有3个CSR库(CSR名称的首字母不同)—与3个特权级别(U,S,M)大致相关联—其中大多数是可选的(实际上只需要M)。
它们在那里,以便完整的实施可以为虚拟机管理程序/虚拟机,操作系统和应用程序提供良好的支持。例如,对于一个简单的应用程序,在嵌入式处理器上,实际上仅需要一个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模拟器,您可以在其中实际编写中断处理程序。