异常和中断机制
中断和异常本质上一样,不同点:
- 缺页”或“溢出”等异常事件是由特定指令在执行过程中产生的;中断不与任何指令相关联,也不阻止任何指令的完成
- 异常的检测由 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 设置一个异常状态寄存器,用于记录异常原因
- 操作系统使用一个统一的异常或中断查询程序,按优先级顺序查询异常状态寄存器,然后转到内核处理相应程序
- 异常、中断采用
- 硬件识别【向量中断】:
- 异常或中断处理程序的首地址称为中断向量
- 所有中断向量存放在中断向量表
- 每个异常或中断被指定一个中断类型号,可据此快速找到对应的处理程序
- 中断采用