RISC-V-软件中断



我正在尝试为我的RV32I内核实现一个简单的中断控制器。我相信我理解RISC-V中应该如何处理中断,以及CSR寄存器在这个过程中的作用。

RISC-V定义了三种中断源:外部、软件和定时器。我知道定时器和外部中断是如何产生的。然而,我不明白如何或什么会产生软件中断。指令?一系列指令?也许是实现定义的标志?我不知道。

有人能给出一个软件中断的例子和解释吗?如果相关的话,最好是相关的汇编代码?

提前感谢!

您要查找的是mip-csr中的SSIP和USIP位。

在当前hart上触发主管级软件中断通过将1写入其监控软件中断挂起(SSIP(位在sip寄存器中。挂起的主管级软件中断可以通过将0写入sip中的SSIP位来清除。主管级别当sie寄存器中的SSIE位为清楚的

用户级软件中断由在中向其用户软件中断挂起(USIP(位写入1sip寄存器。可以清除挂起的用户级软件中断通过将0写入sip中的USIP位。用户级软件中断当sie寄存器中的USIE位被清除时被禁用。

您可以在The RISC-V Instruction Set Manual Volume II: Privileged ArchitectureV20190608中找到此信息。

软件中断是由(用户(程序执行引起的。

软件中断可以从ecall发生——相当于MIPS上的syscall;这是用户程序对操作系统服务的请求,它以可控的方式跨越权限边界。

软件中断也可能发生在非法或格式错误的内存操作中,即lwsw

看看表3.6、4.1中的异常列表(这里我只显示后半部分;注意ecall出现在前半部分(:

  • 0指令地址未对齐
  • 1指令访问故障
  • 2非法指令
  • 3断点
  • 4保留
  • 5负载访问故障
  • 6 AMO地址错位
  • 7存储/AMO访问故障
  • 8-11环境

第一个原因是在程序计数器中放置了错误的值(例如奇数(,这可能是由堆栈已损坏的跳转寄存器或返回引起的。

下一步是允许程序计数器引用未映射的地址,即未标记为可执行的页面。

断点通常由软件在调试期间使用。

加载访问故障是指使用加载或存储到未映射或以其他方式受保护的地址。

原子操作有自己的异常编号(不确定原因(。

最后,它们可能是由特权模式(U、S、H、M(之间的切换引起的

相关内容

  • 没有找到相关文章

最新更新