点评: 异常和中端都是trap, cpu 在发生的trap的时候,pc会执行mvec的地址去执行,所有mvec需要提前设置好。此时,mpec放入的当前指令,或者下一条指令地址。 相当于对当前指令的备份, mret就是把mpec的指令拿出放到pc里面执行,当然, mpec的值,我们也可以手动的修改。想跳到哪里随意!!!
mtvec(Machine Trap-Vector Base-Address Register)
- 机器模式下陷阱处理程序的入口地址。
- 它决定了当处理器在机器模式下遇到异常或中断时,控制权将转移到哪里
MODE 字段
位置:位 1:0
描述:模式字段,决定陷阱向量的处理模式。
00:直接模式(Direct Mode)
在这种模式下,所有的陷阱都会跳转到 BASE 字段指定的地址。
01:向量模式(Vectored Mode)
在这种模式下,不同的陷阱类型会跳转到 BASE 字段加上一个偏移量的地址。偏移量通常是根据陷阱原因(异常或中断)计算的。
10 和 11:保留(Reserved)
这些模式是保留的,当前未定义。
BASE 字段
位置:位 31:2(对于 32 位架构)或 位 63:2(对于 64 位架构)
描述:基地址字段,存储陷阱处理程序的基地址。这个地址必须对齐到 4 字节边界,因此最低的两位通常是 0。
mepc 寄存器/mcause 寄存器 ,这两个寄存器里面的值都是cpu自己放入进去。
void trap_test()
{
//这行代码试图从地址 0x00000000 加载一个整数值。然而,地址 0x00000000 通常是不可访问的。因此,这会触发一个加载访问错误
//异常代码:5 异常名称:加载访问错误(Load Access Fault)mcause 的值:5
*(int *)0x00000000 = 100;
uart_puts("Yeah! I'm return back from trap!\n");
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。