进入中断
1.跳转到CSR寄存器mtvec(machine Trap-Vector Base-Address Register)——可读可写——定义的PC地址开始进行
mode = 0. 跳转到BASE
mode = 1. 跳转到BASE + 4 * CAUSE(异常编号)
2.更新CSR寄存器mcause
3.更新CSR寄存器 mepc(机器模式异常PC寄存器 Machine Exception Program Counter,可读可写)
保存返回PC
自动更新mepc为当前遇到指令的pc值
mepc = pc+4(2),下一条尚未执行指令
4.更新CSR寄存器mtval( Machine Trap Value Register ),以反映引起当前异常的存储器访问地址或者指令编码。
存储器访问异常(断点、取指读写异常):mtval = 存储器访问地址
非法指令:mtval = 非法指令编码
5.更新CSR寄存器mstatus (Machine Status register)
MIE = 1 : machine mode 所有中断都打开,进入异常之后MIE = 0,由此可知RISCV结构不支持硬件中断嵌套,可进行软件中断嵌套
MIE = 0 : machine mode 所有中断关闭
MPIE = 异常发生前的MIE,作用是异常结束之后可以恢复之前MIE
MPP = 异常发生前的模式,如果只支持机器模式,则===11
6.更新CSR寄存器mie(Machine Interrupt Enable Register,可读可写)——该寄存器用来精确的控制中断的屏蔽
MEIE 域控制机器模式(Machine Mode )下外部中断( External Interrupt )的屏蔽。
MTIE 控制机器模式( Machine Mode )下计时器中断( Timer Interrupt 屏蔽。
MSIE 域控制机器模式(Machine Mode )下软件中断( So ware Interrupt )的屏蔽。
软件可以通过写 mie 寄存器中的值达到屏蔽某些中断的效果。假设 MTIE 域为被设置成 0,则意味着将计时器中断屏蔽, 处理器将无法响应计时器中断
7.更新mip(Machine Interrupt Pending Registers,可读可写)——用于查询中断的等待状态
MEIP 域反映机器模式(Machine Mode )下的外部中断的等待( Pending )状态,若MEIP = 1,则表示当前有外部中断正在等待(Pending)。
——即使mie中MEIE为0,MEIP仍可为1
执行异常(异常服务程序)
进入异常之后,从mtvec的pc执行,根据cause编号,进入不同 异常服务子程序。
退出异常
相关指令(Trap Return Instruction):MRET,SRET,URET
1.pc = mepc
2.mstatus.MIE = MPIE
3.mstatus.MPIE = 1