关于中断和异常的一些理解

中断

中断(硬件中断)是cpu为了响应外部突发事件而引入的一种机制。在没有中断机制之前cpu需要频繁查询外部设备的状态来与外部设备进行通信,而有了中断机制后,只有当外部设备要求cpu进行处理时cpu才会与其进行通信,这就大大提高了cpu的效率。

中断分类

  • 可屏蔽中断
    可屏蔽中断是为了使在执行某些任务时系统不希望被打断,所以需要把一些中断进行屏蔽。可屏蔽中断请求信号通常是通过CPU的INTR引脚发给CPU的,可以通过CLI 指令把标志寄存器的IF位置零 从而把可屏蔽信号屏蔽。
  • 不可屏蔽中断
    不可屏蔽中断是为了处理某些特殊情况。不可屏蔽中断请求信号是通过CPU的NMI引脚发给CPU的,这时即便使用了CLI指令把标志寄存器的IF位置零了也无法屏蔽这些中断请求信号,CPU依然需要暂停去执行相应的中断处理例程。

异常

异常(有的书上也将其称为软中断,即内部中断)是指程序在执行过程中形成了某些预先设定的情景,即发生某些特定的异常然后cpu会去执行相应的异常处理程序。因为异常有时被认为是软中断,又因为异常不基于硬件(也就是不依靠标志寄存器的IF位),所以所有的异常都属于不可屏蔽的中断。

异常分类

  • 错误类异常
    错误类异常一般是可以在异常处理后回到发生异常的地方继续执行的,也就是说eip指令指针还会指向引发异常的那条指令。例如硬件执行断点引发的异常,在异常处理后依然会执行引发异常的那条指令,如果你不处理他就会一直循环引发异常无法往下继续运行。
  • 陷阱类异常
    陷阱类异常一般是在执行完某条指令后引发的异常,因此当发生异常时eip指令指针寄存器已经指向引发异常的下一条指令。但是也有一些特殊情况,如int3引发的断点异常就时陷阱类异常,但是系统为了支持调试会让异常处理程序令eip-1使其又指向引发异常的那条指令。
  • 中止类异常
    中止类异常一般是发生了一些严重的错误,系统无法令程序恢复执行只能结束运行。

中断和异常的关系

  • 有时我们把中断和异常混为一谈,会把异常称之为软中断(内部中段)。
  • 中断和异常的只是其产生的根源有本质的区别,异常和中断都是都是通过中断向量表中获得相应的ISR(中断处理程序)地址,然后调用相应的中断处理程序进行处理。对于异常来说这个中断处理程序就相当于是异常处理程序。

参考《软件调试》

原文地址:https://www.cnblogs.com/revercc/p/13287070.html