首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RISC-V -软件中断

RISC-V -软件中断
EN

Stack Overflow用户
提问于 2020-11-16 18:36:52
回答 2查看 2.7K关注 0票数 0

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

RISC-V定义了三种中断来源:外部中断、软件中断和定时器。我明白定时器和外部中断是如何产生的。但是,我不明白如何或什么会产生软件中断。指令?一系列指令?可能是实现定义的标志?我没有头绪。

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

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 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中找到这些信息。

票数 2
EN

Stack Overflow用户

发布于 2020-11-16 22:08:01

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

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

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

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

instruction

  • 3
  • 0指令地址不对齐
  • 1指令访问错误
  • 2非法的

断点

  • 4保留

<代码>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)之间的切换引起的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64863737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档