我正在尝试为我的RV32I内核实现一个简单的中断控制器。我相信我理解在RISC-V中应该如何处理中断,以及CSR寄存器在这个过程中的作用。
RISC-V定义了三种中断来源:外部中断、软件中断和定时器。我明白定时器和外部中断是如何产生的。但是,我不明白如何或什么会产生软件中断。指令?一系列指令?可能是实现定义的标志?我没有头绪。
有人能给出一个例子和软件中断的解释,如果相关的话最好用相关的汇编代码来解释吗?
提前感谢!
发布于 2020-11-16 19:57:40
您正在寻找的是来自mip csr的SSIP和USIP位。
一种监控程序级的软件中断是在当前hart上通过在sip寄存器中写入1到其主管软件中断挂起(SSIP)位来触发的。挂起的监控程序级软件中断可以通过将0写入sip中的SSIP位来清除。当sie寄存器中的SSIE位清除时,监控程序级的软件中断将被禁用.
用户级软件中断通过将1写入sip寄存器中的用户软件中断挂起(USIP)位在当前hart上触发。挂起的用户级软件中断可以通过将0写入sip中的USIP位来清除。当sie寄存器中的USIE位清除时,用户级软件中断将被禁用.
您可以在The RISC-V Instruction Set Manual Volume II: Privileged Architecture V20190608中找到这些信息。
发布于 2020-11-16 22:08:01
软件中断是由(用户)程序执行引起的。
软件中断可以从ecall中发生--相当于MIPS上的syscall;这是用户程序对操作系统服务的请求,它以一种控制良好的方式跨越权限边界。
软件中断也可能发生在非法或格式错误的内存操作中,如lw、sw。
查看表3.6、4.1中的异常列表(这里我只显示下半部分;注意ecall出现在前半部分):
instruction
断点
<代码>H 1155加载访问错误<代码>H 216<代码>H 1176个AMO地址错误对齐<代码>H 218<代码>H 1197存储/AMO访问错误<代码>H 220<代码>H 1218-11环境<代码>H 222/代码><代码>F 223
第一个原因是将坏值(例如,奇数)放置在程序计数器中,这可能是由堆栈已损坏的跳转寄存器或返回引起的。
下一个方法是允许程序计数器引用未映射的地址,即未标记可执行文件的页。
断点通常由软件在调试过程中使用。
负载访问错误是指使用加载或存储到未映射或其他受保护的地址。
原子操作给出了它们自己的异常号(不确定原因)。
最后,它们可能是由特权模式(U,S,H,M)之间的切换引起的。
https://stackoverflow.com/questions/64863737
复制相似问题