mips 异常处理

原文网址:http://blog.chinaunix.net/uid-26817832-id-3146385.html

一、硬件完成的工作
1、set epc
2、set EXL 表示进入内核模式和禁止中断
3、set cause寄存器;有的异常也需设置BadVaddr寄存器
4、跳到异常入口执行

二、软件工作

1、区分不同的异常,Cause寄存器的ExcCode域

2、准备空间保存寄存器状态,由SAVE_ALL宏完成
说明几点:
1)、获得空间方法如下:
若是用户态 --> 内核态,则 k0 = sp, sp = *kernelsp - PT_SIZE,store k0, PT_R29(sp),保存其它寄存器。

若是内核态 --> 内核态,直接 k0 = sp, sp = sp - PT_SIZE,store k0, PT_R29(sp),然后保存其它寄存器。

获得空间大小是PT_SIZE,寄存器按照特定的方式保存,形成一个 struct pt_regs 结构,传递给子函数。
2)、在SAVE_ALL宏中,保存了epc,和status,cause寄存器,这样就可以异常嵌套

3、调用子函数(sp作为参数),做任何你想做的事。

4、从子函数返回到ret_from_exception宏,ret_from_exception宏调用RESTORE_ALL宏完成寄存器状态的回复,最后恢复sp寄存器,即恢复到sp+PT_SIZE处。

5、eret,同时完成清除SR(EXL)位,把控制权交给epc指向的指令。

三、疑问探究

C语言中主函数中调用子函数,栈的处理过程:

1、进入子函数的时候,编译器完成sp - size
2、子函数执行过程中,定义的变量会放到栈上,如果用到s0-s7寄存器,编译器会把s0-s7的值保存到栈上
3、子函数返回时后,编译器先恢复s0-s7寄存器,再将sp + 适当的size到进入子函数时sp处。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值