文章目录
- 流
- mtvec
- mepc
- mcause
- mtval
- mstatus
- trap 初始化
- trap的top half(硬件完成)
- trap的bottom half(软件完成)
- 从trap返回
- 代码实现
流
控制流:程序控制的执行流
trap分为中断和异常
mtvec
base:存储trap入口函数的基地址右移两位的即四字节对齐的地址
WARL:可以写任何值,但读出来的值需要是合法才行
mepc
异常执行完后恢复到原来执行流,
MXLEN:就是CPU处理长度
mcause
WLRL:读写该部分都必须是合法值
mtval
对mcause做的一个补充
在RISC-V架构中,mtval
是 Machine Trap Value 寄存器(机器陷阱值寄存器)的缩写,它是RISC-V架构定义的一部分,用于异常处理机制。
当发生硬件引发的异常,如load访问错误、store访问错误、非法指令等时,mtval
寄存器会被设置为相关的错误值。具体来说:
- 对于 load 或 AMO (原子操作) 访问错误,
mtval
保存的是导致错误的地址。 - 对于 store 访问错误,
mtval
同样保存的是试图进行非法存储操作的地址。 - 对于指令相关异常(如非法指令),
mtval
存储的是触发异常的指令的地址。
程序员或操作系统可以通过检查 mtval
寄存器的内容来确定导致异常的具体原因,这对于调试和异常处理程序非常重要。在RISC-V架构的特权模式下,不同的异常等级(如Machine、Supervisor、User等)会有对应的陷阱值寄存器,例如在Supervisor模式下,类似的寄存器可能是scause
和sbadaddr
。
mstatus
xPIE保持执行trap时前保持当前的xIE,trap执行后再恢复到xIE去
xPP保持陷入当前权限x之前的权限级别值,陷入到M权限之前的权限可以说M U S 所以用两个比特位表示这三种状态。陷入到S之前的权限可以是 U S 所以用一个比特位表示,陷入到U只能是U,那没有必要保存,因为执行完trap后恢复到的和执行trap时一样。
WPRI:读这个寄存器的时候忽略该部分的值,写这个寄存器的时候要保留该部分原来的值(不要变)
trap 初始化
设置mtvec地址为自己设置的异常处理程序的入口地址
在RISC-V架构中,mtvec
是 Machine Trap Vector Base Address Register(机器陷阱向量基地址寄存器)的缩写。此寄存器在RISC-V处理器中扮演着核心的角色,它负责决定在发生硬件异常或中断时,处理器应跳转到何处执行相应的处理代码。
mtvec
寄存器的结构通常包括两部分:
-
Base Address(基地址):存储了一个物理地址,当发生异常或中断时,处理器会跳转到这个地址处执行异常处理程序的第一条指令。
-
Mode(模式):
- Direct Mode(直接模式):在这种模式下,基地址字段直接指向异常处理程序的入口地址。
- Vectored Mode(向量化模式):这种模式下,基地址字段指向一个固定的向量表,向量表中的每一个条目对应一种特定的异常类型。当异常发生时,处理器根据异常类型从向量表中索引出相应的处理程序地址。
trap的top half(硬件完成)
- MIE复制到MPIE中,MIE清0
- 设置mepc,pc设置为mtvec(异常:异常程序处理完后需要重新执行异常指令 中断:执行完处理中断执行下一条指令)
- 设置mcause和mtval
- 设置MPP,权限进入M(无论啥trap都会先切换到machine模型)
.
trap的bottom half(软件完成)
- 切换上下文
- 调用对应的处理函数
- 恢复上下文
- mret
从trap返回
- 恢复权限
- 中断恢复,设置MPP
- pc恢复,设置MPIE
代码实现
https://github.com/FULLK/risllkos/tree/main/Fullkenerl5