跳转到异常处理程序:处理器将PC值设置为mtvec寄存器中指定的地址,开始执行异常处理程序。 异常处理:在异常处理程序中,根据mcause寄存器中的异常原因进行相应的处理。 恢复现场:处理完成后,根据需要修改mepc寄存器的值,以指定返回时的PC值。 返回主程序:执行mret指令,恢复全局中断使能位(MIE),并将PC值设置为mepc寄存...
异常指令的 PC 被保存在 mepc 中,PC 被设置为 mtvec。(对于同步异常,mepc 指向导致异常的指令;对于中断,它指向中断处理后应该恢复执行的位置。) 根据异常来源设置 mcause(如图 10.3 所示),并将 mtval 设置为出错的地址或 者其它适用于特定异常的信息字。 把控制状态寄存器 mstatus 中的 MIE 位置零以禁用中...
mtvec(Machine Trap Vector)它保存发生异常/中断时处理器需要跳转到的地址。 RISC-V 还支持向量中断,其中处理器跳转到各类异常/中断各自对应的地址,而不是一个统一的入口点。这种寻址消除 了读取和解码mcause的需要,加快了中断处理速度。 将mtval [0]设 置为1可启用此功能; 然后根据异常/中断原因x将PC设置为(...
将mtvec寄存器中的值加载到PC上,即跳转到异常处理程序入口地址处。 软件 当硬件自动将mtvec的值设置到PC上时,即进入到了异常处理程序,之后由软件来完成后续的异常处理。 保存异常上下文到栈中。异常上下文指的是所有通用寄存器的值以及部分M模式下的CSR寄存器 ...
mtvec记录的是异常处理函数的起始地址。BASE 字段中的值必须始终对齐于 4 字节边界,并且 MODE 设置可能会对 BASE 字段中的值施加额外的对齐约束。 MODE 目前可以取两种值: 如果MODE 为 0,那么所有的异常处理都有同一个入口地址,否则的话异常处理的入口地址是 BASE+4*CAUSE。(cause 记录在 xcause 中) ...
stvec和mtvec的低2位为0指定异常入口都走stvec/mtvec指定的地址(地址低两位始终为0)(固定地址模式),为1按照中断编号走stvec+i*4/stvec+i*4对应的地址(向量模式),linux代码中默认走的固定地址模式。在arch/riscv/kernel/head.S中以下代码,默认使用的是固定地址模式, .align 2表示2^2=4字节对齐,所以地址...
将机器模式异常处理程序的基地址写入mtvec CSR。这是任何引导流程中的必需步骤。 将mstatus.MPP写入 0 以将之前的模式设置为 User,这允许我们返回到该模式。 设置物理内存保护 (PMP) 区域以将所需区域授予用户和主管模式,并可选择从机器模式撤消权限。
mtvec (0x305):异常处理入口基址寄存器 mepc/mcause (0x341/0x342):异常返回地址与原因编码 mip/mie (0x344/0x304):中断状态与使能位图 计时与计数单元 mcycle/minstret (0xB00/0xB02):时钟周期与指令执行计数器 mcountinhibit (0x320):性能计数器启停控制 ...
mtvec寄存器用来存储异常处理函数入口地址,Direct模式表明只有一个异常处理函数,Vectored模式表示异常处理函数以向量表的形式给出: mcause记录了中断或者异常的具体类型,WLRL表示只有符合要求的值才能被写入: mtvaul寄存器可以提供更多的信息: mstatus寄存器记录了相关状态信息,如是否开中断等(这里的中断控制位控制的是全局...