临沂小学网站建设,专门做喷涂设备的网站,抖音开放平台官网入口,给企业建设网站的流程图RISC-V特权架构 - 机器模式下的异常处理 1 进入异常1.1 从mtvec 定义的PC 地址开始执行1.2 更新CSR 寄存器mcause1.3 更新CSR 寄存器mepc1.4 更新CSR 寄存器mtval1.5 更新CSR 寄存器mstatus 2 退出异常2.1 从mepc 定义的PC 地址开始执行2.2 更新CSR 寄存器mstatus 3 异常服务程… RISC-V特权架构 - 机器模式下的异常处理 1 进入异常1.1 从mtvec 定义的PC 地址开始执行1.2 更新CSR 寄存器mcause1.3 更新CSR 寄存器mepc1.4 更新CSR 寄存器mtval1.5 更新CSR 寄存器mstatus 2 退出异常2.1 从mepc 定义的PC 地址开始执行2.2 更新CSR 寄存器mstatus 3 异常服务程序 本文属于《
RISC-V指令集基础系列教程》之一欢迎查看其它文章。 狭义的中断和异常均可以被归于广义的异常范畴因此本文自此将用“异常”作为统一概念进行论述其包含了狭义上的“中断”和“异常”。
RISC-V 定义的三种模式 User、Supervisor 和 Machine均可发生异常但是只有特权模式 Supervisor 和 Machine 才能处理异常因为处理异常需要 CSR 寄存器。默认情况下RISC-V所有的异常都在Machine模式下处理。除此以外还可以通过委托机制将异常委托给Supervisor模式下处理。
这里本文介绍的是Machine模式下的异常处理机制。
1 进入异常
进入异常时RISC-V 架构规定的硬件行为可以简述如下
1停止执行当前程序流转而从CSR 寄存器mtvec 定义的PC 地址开始执行。
2进入异常不仅会让处理器跳转到上述的PC 地址开始执行还会让硬件同时更新其他几个CSR 寄存器分别是以下4 个寄存器
机器模式异常原因寄存器mcauseMachine Cause Register机器模式异常PC 寄存器mepcMachine Exception Program Counter机器模式异常值寄存器mtvalMachine Trap Value Register 机器模式状态寄存器mstatusMachine Status Register
下文将分别予以详述。
1.1 从mtvec 定义的PC 地址开始执行
RISC-V 架构规定在处理器的程序执行过程中一旦遇到异常发生则终止当前的程序流处理器被强行跳转到一个新的PC 地址。该过程在RISC-V 的架构中定义为“陷阱trap”字面含义为“跳入陷阱”更加准确的意译为“进入异常”。
RISC-V 处理器trap 后跳入的PC 地址由一个叫做机器模式异常入口基地址寄存器mtvecMachine Trap-Vector Base-Address Register的CSR 寄存器指定其要点如下
1mtvec 寄存器是一个可读可写的CSR 寄存器因此软件可以编程更改其中的值。
2mtvec 寄存器的详细格式如下图所示其中的最低2 位是MODE 域高30 位是BASE 域。32位架构下XLEN为3264位架构下XLEN为64。
假设MODE 的值为0则所有的异常响应时处理器均跳转到BASE 值指示的PC 地址。假设MODE 的值为1则狭义的异常发生时处理器跳转到BASE 值指示的PC 地址狭义的中断发生时处理器跳转到BASE4*CAUSE 值指示的PC 地址。CAUSE的值表示中断对应的异常编号Exception Code如下图所示Machine cause register (mcause) values。譬如机器计时器中断Machine Timer Interrupt的异常编号为7则其跳转的地址为BASE4×7BASE28 BASE0x1c。
1.2 更新CSR 寄存器mcause
RISC-V 架构规定在进入异常时机器模式异常原因寄存器mcauseMachine Cause Register被同时更新以反映当前的异常种类软件可以通过读此寄存器查询造成异常的具体原因。
mcause 寄存器的详细格式如下图所示其中最高1 位为Interrupt 域低31 位为异常编号域。 此两个域的组合表示值如下图所示用于指示RISC-V 架构定义的12 种中断类型和16 种异常类型。
1.3 更新CSR 寄存器mepc
RISC-V 架构定义异常的返回地址由机器模式异常PC 寄存器mepcMachine Exception Program Counter保存。 在进入异常时硬件将自动更新mepc 寄存器的值为当前遇到异常的指令PC 值即当前程序的停止执行点。该寄存器将作为异常的返回地址在异常结束之后能够使用它保存的PC 值回到之前被停止执行的程序点。
1值得注意的是虽然mepc 寄存器会在异常发生时自动被硬件更新但是mepc 寄存器本身也是一个可读可写的寄存器因此软件也可以直接写该寄存器以修改其值。
2对于狭义的中断和狭义的异常而言RISC-V 架构定义其返回地址更新的mepc 值有些细微差别
出现中断时中断返回地址mepc 的值被更新为下一条尚未执行的指令。出现异常时中断返回地址mepc 的值被更新为当前发生异常的指令PC。 注意 如果异常由ecall 或ebreak 产生由于mepc 的值被更新为ecall 或ebreak 指令自己的PC。因此在异常返回时如果直接使用mepc 保存的PC值作为返回地址则会再次跳回ecall 或者ebreak指令从而造成死循环执行ecall 或者ebreak 指令导致重新进入异常。正确的做法是在异常处理程序中软件改变mepc指向下一条指令由于现在ecall/ebreak或c.ebreak是4或2字节指令因此改写设定 mepcmepc4或2 即可。 1.4 更新CSR 寄存器mtval RISC-V 架构规定在进入异常时硬件将自动更新机器模式异常值寄存器mtvalMachine Trap Value Register 以反映引起当前异常的存储器访问地址或者指令编码。
如果是由存储器访问造成的异常譬如遭遇硬件断点、取指令、存储器读写造成的异常则将存储器访问的地址更新到mtval 寄存器中。如果是由非法指令造成的异常则将该指令的指令编码更新到mtval 寄存器中。 注意mtval 寄存器又名mbadaddr 寄存器在某些早期版本的RISC-V 编译器中仅识别mbadaddr 名称。 1.5 更新CSR 寄存器mstatus
RISC-V 架构规定在进入异常时硬件将自动更新机器模式状态寄存器mstatusMachine Status Register的某些域。 1mstatus 寄存器的详细格式如上图所示其中的MIE 域表示在Machine Mode 下中断全局使能。
当该MIE 域的值为1 时表示Machine Mode 下所有中断的全局打开。当该MIE 域的值为0 时表示Machine Mode 下所有中断的全局关闭。
2RISC-V 架构规定异常发生时有如下情况。
MPIE 域的值被更新为异常发生前MIE 域的值。MPIE 域的作用是在异常结束之后能够使用MPIE 的值恢复出异常发生之前的MIE 值。MIE 的值则被更新成为0意味着进入异常服务程序后中断被全局关闭所有的中断都将被屏蔽不响应。也就是说RISC-V架构默认不支持中断嵌套。MPP 的值被更新为异常发生前的模式。MPP 域的作用是在异常结束之后能够使用MPP 的值恢复出异常发生之前的工作模式。对于只支持机器模式Machine Mode Only的处理器核则MPP 的值永远为二进制值11。 注意由于为简化知识模型在此仅介绍“只支持机器模式”的架构因此对SIE、UIE、SPP、SPIE 等不做赘述。 2 退出异常
当程序完成异常处理之后最终需要从异常服务程序中退出并返回主程序。RISC-V架构定义了一组专门的退出异常指令Trap-Return Instructions包括MRET、SRET、和URET。
其中MRET 指令是必备的而SRET 和URET 指令仅在支持监督模式和用户模式的处理器中使用。 注意由于为简化知识模型在此仅介绍“只支持机器模式”的架构对SRET 和URET 指令不做赘述。 在机器模式下退出异常时软件必须使用MRET 指令。 RISC-V 架构规定处理器执行MRET 指令后的硬件行为如下
停止执行当前程序流转而从CSR 寄存器mepc 定义的PC 地址开始执行。执行MRET 指令不仅会让处理器跳转到上述的PC 地址开始执行还会让硬件同时更新CSR 寄存器机器模式状态寄存器mstatusMachine Status Register。
下文将分别予以详述。
2.1 从mepc 定义的PC 地址开始执行
在上文中曾经提及在进入异常时mepc 寄存器被同时更新以反映当时遇到异常的指令的PC 值。通过这个机制意味着MRET 指令执行后处理器回到了当时遇到异常的指令的PC 地址从而可以继续执行之前被中止的程序流。
2.2 更新CSR 寄存器mstatus
mstatus 寄存器的详细格式如上图所示。RISC-V 架构规定在执行MRET 指令后硬件将自动更新机器模式状态寄存器mstatusMachine Status Register的某些域。
RISC-V 架构规定执行MRET 指令退出异常时有如下情况
mstatus 寄存器MIE 域的值被更新为当前MPIE 的值恢复。mstatus 寄存器MPIE 域的值则被更新为1。
在上文中曾提及在进入异常时MPIE 的值曾经被更新为异常发生前的MIE 值。而MRET 指令执行后再次将MIE 域的值更新为MPIE 的值。通过这个机制则意味着MRET指令执行后处理器的MIE 值被恢复成异常发生之前的值假设之前的MIE 值为1则意味着中断被重新全局打开。
3 异常服务程序
如上文中所述当处理器进入异常后即开始从mtvec 寄存器定义的PC 地址执行新的程序。该程序通常为异常服务程序并且程序还可以通过查询mcause 中的异常编号Exception Code决定进一步跳转到更具体的异常服务程序。
譬如当程序查询mcause 中的值为0x2则得知该异常是非法指令错误Illegal Instructions引起的因此可以进一步跳转到非法指令错误异常服务子程序中去。
下图所示为一异常入口程序实例片段程序通过读取mcause 的值进而判断异常的类型从而进入不同的异常服务子程序。 注意 由于RISC-V 架构规定的进入异常和退出异常机制中没有硬件自动保存和恢复上下文的操作因此需要软件明确地使用指令进行上下文的保存和恢复。 参考文档
《手把手教你设计CPU.RISC-V处理器》