异常和中断机制

中断和异常本质上一样,不同点:

  • 缺页”或“溢出”等异常事件是由特定指令在执行过程中产生的;中断不与任何指令相关联,也不阻止任何指令的完成
  • 异常的检测由 CPU 自身完成,不必通过外部的某个信号通知 CPU;而 CPU 必须通过中断请求线获取中断源的信息,才能知道哪个设备发生了何种中断

异常(内中断)

基本概念

  • CPU 内部产生的意外事件被称为异常
  • 是 CPU 执行一条命令时,由 CPU 在其内部检测到的,与正在执行指令相关的同步事件
  • 每个指令周期末尾,CPU 都会检查是否有外中断信号需要处理

分类

  • 硬故障中断:由硬连线出现异常引起的
    • 如存储器校验错、总线错误等
    • 包括终止异常和外中断
  • 程序性异常【软件中断】:指在 CPU 内部因执行指令而引起的异常事件
    • 如整除 0、溢出、断点、单步跟踪、非法指令、栈溢出、地址越界、缺页等
    • 包括故障异常和自陷异常

按异常发生的原因和返回方式不同,可分为

故障(Fault)

  • 概念:在引起故障的指令启动之后、执行结束前被检测到的异常事件
  • 举例
    • 指令译码时,出现“非法操作码”
    • 取数据时,发生“缺段”或“缺页”
    • 除数为零
    • 地址越界
  • 注意
    • 对于“缺段”“缺页”等异常事件,处理之后回到发生故障的指令继续执行
    • 断点为当前发生故障的指令
    • 对于“非法操作码”“除数为 0”等,因无法通过异常处理程序恢复故障,因此不能回到原断点执行,必须终止进程的执行

自陷(Trap)

  • 概念:也称陷阱或陷入,是预先安排的一种“异常事件”,就像预先设置好的“陷阱”一样
  • 举例
    • x86 机器中,用于程序调试“断点设置”和单步跟踪功能
    • 系统调用命令
    • 条件自陷指令
  • 注意
    • 系统调用等自陷异常处理之后,回到自陷指令的下一条指令继续执行

终止(Abort)

  • 概念:若在执行指令的过程中发生了使计算机无法继续执行的硬件故障,那么程序将无法继续执行,只能终止
  • 举例
    • 控制器出错
    • 存储器校验错
    • 调出中断服务程序来重启系统
  • 注意
    • 不是由特定指令产生的,而是随机发生的

中断(外中断)

基本概念

  • 由来自 CPU 外部的设备发出的中断请求(常用于输入输出)被称为中断
  • 典型的由外部设备触发的、与当前正在执行的指令无关的异步事件
  • 外部 I/O 设备通过特定的中断请求信号线向 CPU 提出中断请求
  • CPU 每执行完一条指令检查中断请求信号线,若检测到中断请求,则进入中断响应期
  • 外部中断都是在一条指令执行完成后(中断周期)才被检测并处理的

分类

举例

  • I/O 中断:键盘输入,打印机缺纸
  • 时钟中断

可屏蔽中断

  • 概念
    • 通过可屏蔽中断请求线 INTR 向 CPU 发出的中断请求
    • CPU 可以通过在中断控制器中设置相应的屏蔽字来屏蔽或不屏蔽它,被屏蔽的中断信号将不被送到 CPU

不可屏蔽中断

  • 概念
    • 通过不可屏蔽中断请求线 NMI 向 CPU 发出的中断请求
    • 通常是非常紧急的硬件故障,如电源掉电

异常和中断响应过程

  • 从 CPU 检测到异常或中断事件,到调出相应的处理程序,整个过程称为异常和中断响应
  • 响应过程不可被打断,整个中断处理过程是软 / 硬件协同实现的
  • 异常和中断事件都是由硬件检测实现的

关中断

  • 在保存断点和程序状态期间,不能被新的中断打断,因此要禁止响应新的中断,即关中断
  • 设置中断允许触发器(IF)实现【IF = 1 代表开中断,表示允许响应中断】

保存断点和程序状态

  • 为了能在异常和中断处理后正确返回到被中断的程序继续执行,必须将程序的断点(返回地址)送到栈或特定寄存器中
  • 通常保存在中,为了支持异常或中断的嵌套
  • 被中断时的 PSW 也要保存,并在返回时恢复

识别异常和中断并转到相应的处理程序

  • 软件识别
    • CPU 设置一个异常状态寄存器,用于记录异常原因
    • 操作系统使用一个统一的异常或中断查询程序,按优先级顺序查询异常状态寄存器,然后转到内核处理相应程序
    • 异常、中断采用
  • 硬件识别【向量中断】:
    • 异常或中断处理程序的首地址称为中断向量
    • 所有中断向量存放在中断向量表
    • 每个异常或中断被指定一个中断类型号,可据此快速找到对应的处理程序
    • 中断采用