【问题标题】:RISC-V - Software InterruptsRISC-V - 软件中断
【发布时间】:2023-04-09 22:08:01
【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

    标签: interrupt riscv irq softirq


    【解决方案1】:

    您正在寻找的是来自 mip csr 的 SSIP 和 USIP 位。

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

    在当前 hart 上触发用户级软件中断 将 1 写入其用户软件中断挂起 (USIP) 位 SIP 寄存器。可以清除挂起的用户级软件中断 通过将 0 写入 sip 中的 USIP 位。用户级软件中断 sie 寄存器中的 USIE 位清零时禁用。

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

    【讨论】:

    • 您分享的摘录是针对sip注册的,不是针对mip注册的,S-mode和U-mode不是必须的。尽管如此,根据规范,mip.MSIP 位是“通过访问内存映射控制寄存器写入的”。这是否仅仅意味着使用简单的存储指令来设置/清除该位?
    • mip 和 mie 寄存器的受限视图显示为 sip/sie。对于 write 这意味着您需要使用 csrw, csrs .... 设置 csr 中的位
    【解决方案2】:

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

    软件中断可以从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)之间的切换引起的

    【讨论】:

    • 这几乎是有道理的,但您列出的是 exceptions,而不是 interrupts。那么,它们怎么可能是软件中断?特别是,您明确表示ecall 可以触发软件中断。但是,规范明确指出ecall 指令将生成environment-call-from-X-mode 异常,其中 X 是特权模式。看起来有一些矛盾,你能澄清一下吗?
    • 软件中断例外。处理器对外部中断和软件中断使用相同的异常处理机制——只有一种机制。
    • 从软件的角度来看,软件中断和外部中断看起来很不一样。但从硬件的角度来看,只需要一种机制来为两者提供服务。
    • 我同意处理机制是相同的,但是有一些重要的细节仍然没有加起来。您是说上面列出的异常软件中断。在特权规范中,我们可以看到 RISC-V 中所有中断和异常的异常代码。为方便起见,Here 是该表。显然,软件中断异常不共享相同的异常代码。事实上,您列出的每个异常都有自己的异常代码。
    • 那么,例如,在指令地址未对齐的情况下异常,硬件将如何处理呢?它会像您声称的那样产生软件中断吗?还是会产生instruction address misaligned异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 2021-12-29
    • 2018-11-22
    • 2023-03-22
    • 1970-01-01
    • 2015-09-10
    相关资源
    最近更新 更多