异常控制流

现代操作系统必须能够对系统状态的变化做出反应,这些系统状态不是被内部程序变量捕获的,而且也不一定要和程序的执行相关。比如,一个硬件定时器定期产生信号,这个事件必须得到处理。包到达网络适配器后,必须存放在内存中。程序向磁盘请求数据,然后休眠,直到被通知说数据已就绪。当子进程终止时,创造这些子进程的父进程必须得到通知。

现代系统通过使控制流发生突变来对这些情况做出反应。一般而言,我们把这些突变称为异常控制流(Exceptional Control Flow,ECF)。

异常控制流发生在计算机系统的各个层次。

  • 在硬件层,硬件检测到的事件会触发控制突然转移到异常处理程序。
  • 在操作系统层,内核通过上下文切换将控制从一个用户进程转移到另一个用户进程。
  • 在应用层,一个进程可以发送信号到另一个进程,而接收者会将控制突然转移到它的一个信号处理程序。—个程序可以通过回避通常的栈规则,并执行到其他函数中任意位置的非本地跳转来对错误做出反应。
    像 C++ 和 Java 这样的语言通过 try、catch 以及 throw 语句来提供软件异常机制。软件异常允许程序进行非本地跳转(即违反通常的调用/返回栈规则的跳转)来响应错误情况。非本地跳转是一种应用层 ECF,在 C 中是通过 setjmplongjmp 函数提供的。理解这些低级函数将帮助你理解高级软件异常如何得以实现。

异常

异常(exception)就是控制流中的突变,用来响应处理器状态中的某些变化。
在任何情况下,当处理器检测到有事件发生时,它就会通过一张叫做异常表(exception table) 的跳转表,进行一个间接过程调用(异常),到一个专门设计用来处理这类事件的操作系统子程序(异常处理程序(exception handler)) .当异常处理程序完成处理后,根据引起异常的事件的类型,会发生以下 3 种情况中的一种:

  • 处理程序将控制返回给当前指令 ,即当事件发生时正在执行的指令。
  • 处理程序将控制返回给下一条指令,如果没有发生异常将会执行的下一条指令。
  • 处理程序终止被中断的程序。

异常的分类

异常可以分为四类:中断(interrupt)陷阱(trap)故障(fault)终止(abort)。图 8-4 中的表对这些类别的属性做了小结。

类别原因异步/同步返回行为
中断来自 I/O 设备的信号异步总是返回到下一条指令
陷阱有意的异常同步总是返回到下一条指令
故障潜在可恢复的错误同步可能返回到当前指令
终止不可恢复的错误同步不会返回

软中断又叫做编程异常(programmed exception),是异常的一种。在计算机中,中断可以分为同步中断和异步中断两种。

  • 同步中断:同步中断也叫做异常。同步中断是当指令执行时由CPU控制单元产生,并且只有在该指令终止执行后CPU才会发出中断。
  • 异步中断:异步中断也叫做中断。异步中断是由其他硬件设备随机产生的。 异步中断又可以细分为处理器探测异常(process-detected exception)和编程异常(programmed exception)。具体细分如下:
    • 处理器探测异常:处理器探测异常是当CPU执行指令时探测到的一个反常条件所产生的异常。根据CPU控制单元产生异常时保存在内核态堆栈EIP寄存器的值,可以将处理器探测异常分为3类:
      • 故障(trap):故障通常可以纠正。发生故障时保存在EIP中的值是引起故障的指令地址。因此,当异常处理程序顺利完成,即故障纠正,就会重新执行引起故障的那条指令。缺页异常就是基于这个机制。
      • 陷阱(trap):陷阱指令执行后会立即报告给CPU。保存在内核态堆栈EIP的值是一个随后要执行的指令地址。因此,当陷阱处理程序终止时,就会接着执行下一条指令。只有当没有必要重新执行已终止的指令时,才触发陷阱。陷阱的主要用途是为了调试程序。
      • 异常终止(abort):异常中止出现在发生了一个严重的错误。此时控制单元出了问题,不能在内核态堆栈EIP寄存器中保存引起异常的指令所在的确切位置。因此,异常中止会使受影响的进程终止。
    • 编程异常:编程异常在编程者发出请求时发生。控制单元把编程异常作为陷阱来处理。因此,编程异常和陷阱类似,当编程异常处理程序终止时,紧接着执行下一条指令。

参考

  1. 软中断和硬中断
  2. Linux硬中断和软中断
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值