软件调试笔记4

来源:互联网 发布:防御矩阵无限金币 编辑:程序博客网 时间:2024/05/06 09:53

目的

为了让CPU能够暂停当前的任务,转去处理突发事件或者其他需要处理的任务,于是设计了中断interrupt跟异常exception机制。


1. 中断

中断通常是CPU外部的输入输出设备触发的,供外部设备通知CPU有事情需要处理,让CPU去处理中断处理例程(ISR-interrupt service routine).

但也可以通过执行CLI(clear interrupt)指令来清除标志寄存器的IF位,使CPU暂时不受打扰。这样只能屏蔽可屏蔽的中断maskable interrupt, 不能屏蔽不可屏蔽中断non-maskable interrupt。

在硬件级别,中断由一块专门的芯片来管理,称为中断控制器,它负责分配中断资源和管理各个中断发出的中断请求。


2. 异常

与中断不同,异常通常是CPU在执行指令时候因为检测到预先定义的某个或者多个条件而产生的同步事件。异常的来源有三种:

一: 程序错误,当CPU执行程序指令遇到操作数有错误或者检测到指令规范中定义的非法情况,比如除数是0.

二:来自某些特殊指令。比如INT3指令。

三:来自CPU引入的机器检查异常,即当CPU指令执行期间检测到CPU内部或者外部的硬件错误。


分类:

错误Fault:导致错误的异常通常可以被纠正,一旦纠正后程序可以无损失的恢复执行。因为发生异常时候的状态都保存了下来。某些情况下也是不可恢复的。

陷阱Trap:与错误异常不同,当CPU报告陷阱类异常时,导致该异常的指令已经执行完毕。所以存储的是下一条要执行的指令,不一定是相邻指令,比如跳转指令。导致陷阱类的异常通常也是可以无损失的恢复执行的,比如INT 3导致的断点异常,可以从调试器返回到程序继续执行。

中止abort:中止类异常主要用于报告严重的错误,不允许恢复继续执行。因为一是CPU并不总能保证这种情况下报告的异常的指令地址是精确的,二是出于安全性考虑,这类异常可能是由于导致该异常的程序执行非法操作导致的。


比较

根本差异是异常来自于CPU本身,是CPU主动产生的,而中断来自于外部设备,是中断源发起的,CPU是被动的。所以确切的说,INT n指令是异常,而非中断,它只是设置了标志位,是由CPU本身产生的。

尽管中断和异常有着本质区别,但是CPU跟操作系统还是用统一的方式来响应跟管理他们的。