学习笔记——异常控制流(一)

1.异常

  异常,是异常控制流的一种形式。它是控制流中的突变,用来响应处理器状态的某些变化。(中断和异常可以在一起对比说明)一部分是由硬件实现,一部分是由操作系统实现,异常处理需要硬件和软件紧密合作。
  中断是异常的一种类型,但中断是由中断源引起的,CPU处于被动状态;其他类型的异常是由CPU引起的,CPU处于主动状态。

2.异常处理

  当异常发生时,处理器会通过一张称为异常表(exception table)的跳转表,间接调用对应的异常处理程序(exception handler)。该异常表在系统启动时由操作系统分配和初始化,包含异常处理程序的地址。
  异常处理完成后,会根据引起异常的事件类型,发生以下3种情况中的一种:
  1.返回当前指令;
  2.返回下一条指令;
  3.终止被中断的程序。
系统中每一种可能的异常类型都分配唯一的非负整数的异常号(exception number),异常号是异常表中的索引,异常表的起始地址放在异常表基址寄存器的提出CPU寄存器中。
异常好索引过程
异常与过程调用类似,但有不同之处:

  • 过程调用前,处理器将放回地址压入栈中;异常根据其类型,返回地址要么是当前指令,要么是下一条指令。
  • 异常调用会将一些额外的处理器状态压到栈里,在处理程序返回后,重新执行被中断的程序需要这些状态。
  • 如果控制从用户程序转移到内核,所有这些项目被压到内核栈中,而不是用户栈。
  • 异常处理程序运行在内核模式下。

3.异常类型

  异常可以分为:中断、陷阱、故障、终止。
异常的类型和处理

  • 中断
      中断是异步发生的。由CPU外部I/O设备的引发,而处理中断的异常处理程序一般被称为中断处理程序(interrupt handler)。
    中断处理
      在当前指令执行完之后,处理器注意到中断的产生,就从系统总线中读取异常号,调用相应的中断处理程序。但处理程序返回时,将控制返回给下一条指令。
      剩下的3种(陷阱、故障、终止)是同步发生的,是执行当前指令的结果,这类指令称为故障指令
      
  • 陷阱和系统调用
      陷阱是有意的异常,其最重要的用途是在用户空程序和内核之间提供一个像过程一样的接口,称为系统调用
      用户程序经常需要想内核请求服务,如read(读一个文件)、fork(创建一个新进程)、execve(加载一个新的程序)、exit(终结当前进程)。对于这种情况,处理器提供了一条特殊的“syscall n”指令来实现用户程序对这些内核服务的受控的访问。
    陷阱处理
      执行syscall指令会导致一个到异常处理程序的陷阱,这个处理程序解析参数,并调用适当的内核程序。
      系统调用和普通的函数调用的实现是非常不同的,普通的函数运行在用户模式下,限制了函数可以执行的指令类型,而且只能访问与调用函数相同的栈;系统调用运行在内核模式,允许系统调用特权指令,访问内核中的栈。
  • 故障
       故障是由错误引起的,能够被故障处理程序修正。当故障发生时,处理器将控制权转移给故障处理程序(事实上每个处理程序都能获得控制权)。如果处理程序能够修正这个错误情况,则将控制返回到引起该故障的指令,从而重新执行它;否则,返回到内核中的abort例程,该例程会终止引起故障的应用程序。
    故障处理
  • 终止
      终止是不可恢复的致命错误造成的结果,通常是一些硬件错误。处理程序将控制直接返回给abort例程。

猜你喜欢

转载自blog.csdn.net/timmy_attack/article/details/79119855