操作系统——异常处理

Intel官方白皮书Volume3的6.5节

异常分为3种,错误(fault)、陷阱(trap)、终止(abort)

  • 错误(fault):错误是一种可以被修复的异常,只要错误被修正,处理器就可以将进程或任务的运行环境恢复到这条语句的执行地址,继续执行
  • 陷阱(trap):一条指令产生了异常,其状态同样可以恢复,但是执行异常处理程序之后恢复的位置是异常指令的下一条指令
  • 终止(abort):十分严重的错误,异常原因无迹可循,会终止程序或任务的执行,无法恢复

终止异常发生后,程序不会再继续执行(或者说现场不可恢复),而错误、陷阱两种异常可以恢复程序的现场,但是错误会重新执行触发异常的指令,而陷阱会跳到异常指令的下一条指令

在这里插入图片描述

对于错误和陷阱,因为可以恢复现场,那么从当前指令跳转到中断处理程序这个过程中,需要保存当前的程序状态(将EFLAGES、CS、EIP,错误代码(ErrorCode)入栈),在这之中,可能会有一种情况,当中断处理程序的特权级比当前程序的特权级要大的时候,还需要切换栈帧,则在保存之前的那些程序状态之前,还需要将当前程序的堆栈信息保存到中断处理程序的堆栈中去

  • 异常程序和中断处理程序的特权级相同

在这里插入图片描述

  • 异常程序的特权级小于中断处理程序的特权级

在这里插入图片描述

归纳起来中断处理程序的调用过程可以这样理解

  1. 指令执行发生异常

根据异常捕获的中断向量号在中断描述符表IDT中查找相关记录,得到段选择子(Selecor)段内偏移地址(Offset),段选择子是一个索引,用于在GDT(全局描述符表)LDT(局部描述符表)获得段的基址Base,根据Base+Offset得到程序地址,利用call跳转到中断处理程序中去

  1. 执行中断处理程序

跳转到中断处理程序之后,检查中断处理程序的特权级与当前特权级进行比较,如果中断处理特权级大于当前特权级,则需要切换堆栈,并且在保存EFLAGS、CS、EIP、ErrorCode之后还要保存当前程序的堆栈信息(SS+ESP),然后开始执行中断处理程序,执行完毕之后,恢复现场

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值