在看此笔记之前,童鞋们一定要了解mips的异常的种类和特性(优先级);以及入口地址;
了解通常中断的入口和初始化;(我真的看了老久了)
中心思想:学习流程!
mips通用异常(中断)的机器指令入口地址0x80000180(no-tlb,cached),
此处的指令:在初始化的时候来安排:set_handler(0x180, &except_vec3_generic, 0x80);
cpu发生什么异常,在此处需要一个简单的处理;(不用找,只能是汇编)
//......................................
except_vec3_generic:汇编指令;
NESTED(except_vec3_generic, 0, sp)
.set push
.set noat
mfc0 k1, CP0_CAUSE
andi k1, k1, 0x7c
//查看是哪一种通用异常(下面有cause寄存器):
PTR_L k0, exception_handlers(k1)//通过set_except_vector给exception_handlers添加所有的入口;
jr k0
.set pop
END(except_vec3_generic)
这样说明一点,现场的保护由异常具体情况来执行的;
上图是状态寄存器和cause寄存器
//..........................................................................................
下面以exception_handlers[0]来说明中断类异常的操作流程;
NESTED(handle_int, PT_SIZE, sp)
SAVE_ALL//保持进程上下文;
CLI//关中断;
//TRACE_IRQS_OFF
//但是不明白的是,为什么会暂存在S0;传递给ret_form_irq??
(ret_form_irq)会执行LONG_S s0, TI_REGS($28)
//推测,如果new stack的话,TI_REGS($28)为NULL;
//推测,如果old stack的话,TI_REGS($28)为ti的地址TI_REGS($28)==$28?
//来自save_all;
LONG_L s0, TI_REGS($28)
LONG_S sp, TI_REGS($28)//?????
//存入sp;thread_info的寄存器指针regs指向sp的位置,也就是PT_reg的位置
//有什么作用?在plat_irq_dispatch上会被使用到?还是debug时用到?
PTR_LA ra, ret_from_irq//handle执行完毕之后的返回地址;
j plat_irq_dispatch//路径分发:处理具体的问题;
END(handle_int)
最重要的地方就是ra=ret_form_irq;在handle_int执行后就是执行它了;
//..................................................................................
阅读(1139) | 评论(0) | 转发(0) |