中断与异常
中断/异常机制
中断/异常 对于操作系统的重要性就好比:汽车的发动机、飞机的引擎
可以说操作系统是由“中断驱动”或者 “事件驱动”的
概念
CPU对系统发生的某个事件作出的一种反应
CPU暂停正在执行的程序,保留现场后自动转去执行相应事件的处理程序,处理完成后返回断点,继续执行被打断的程序
主要作用
及时处理设备发来的中断请求
可使OS捕获用户程序提出的服务请求
防止用户程序执行过程中的破坏性活动
…… 等等
历史背景——为什么引入中断与异常
中断的引入:为了支持CPU和设备之间的并行操作
当CPU启动设备进行输入/输出后,设备便可以独立工作, CPU转去处理与此次输入/输出不相关的事情;当设备完成输入/输出后,通过向CPU发中断报告此次输入/输出的结 果,让CPU决定如何处理以后的事情
异常的引入:表示CPU执行指令时本身出现的问题
如算术溢出、除零、取数时的奇偶错,访存地址时越界或执行了“陷入指令” 等,这时硬件改变了CPU当前的执行流程,转到相应的错误处理程序或异常处理程序或执行系统调用
类别
类别 | 原因 | 异步/同步 | 返回行为 |
中断(Interrupt) | 来自I/O设备、其他硬件部件 | 异步 | 总是返回到下一条指令 |
异常 - 陷入(Trap) | 有意识安排的 | 同步 | 返回到下一条指令 |
异常 - 故障(Fault) | 可恢复的错误 | 同步 | 返回到当前指令 |
异常 - 终止(Abort) | 不可恢复的错误 | 同步 | 不会返回 |
事件
事件
中断(外中断):外部事件,正在运行的 程序所不期望的
I/O中断
时钟中断
硬件故障
异常(内中断):由正在执行的指令引发
系统调用
页故障/页错误
保护性异常
断点指令
其他程序性异常 (如算术溢出等)
工作原理
中断/异常机制是现代计算机系统的核心机制之一;硬件和软件相互配合而使计算机系统得以充分发挥能力
硬件该做什么事? —— 中断/异常响应
捕获中断源发出的中断/异常请求,以一定方式响应,将处理器控制权交给特定的处理程序
软件要做什么事? —— 中断/异常处理程序
识别中断/异常类型并完成相应的处理
中断向量表
中断向量
一个内存单元,存放中断处理程序入口地址和程序运行时所需的处理机状态字。
Linux 中的中断向量表
中断响应
设备发出中断信号
硬件保存原程序现场并暂停原程序的执行
根据中断码查询中断向量表
把中断处理程序入口地址等推送到相应的寄存器
执行中断处理程序
恢复现场,返回被事件打断的程序
实例:X86处理器对中断/异常的支持
中断
由硬件信号引发的,分为可屏蔽和不可屏蔽中断
异常
由指令执行引发的,比如除零异常
80x86处理器发布了大约20种不同的异常
对于某些异常,CPU会在执行异常处理程序之前产生硬件出错码,并压入内核态堆栈
系统调用
异常的一种,用户态到内核态的唯一入口
中断向量表/中断描述符表
实模式:中断向量表 (Interrupt Vector)
存放中断服务程序的入口地址
入口地址=段地址左移4位+偏移地址
不支持CPU运行状态切换
中断处理与一般的过程调用相似
保护模式:中断描述符表 (Interrupt Descriptor Table)
采用门(gate) 描述符数据结构表示中断向量
在保护模式下,中断描述符表(IDT)中的每个表项由8个字节组成,其中的每个表项叫做一个门描述符(Gate Descriptor), “门”的含义是指当中断发生时必须先访问这些“门”,能够“开门”(即将要进行的处理需通过特权检查,符合设定的权限等约束)后,然后才能进入相应的处理程序。而门描述符则描述了“门”的属性(如特权级、段内偏移量等)。
四种类型门描述符
任务门(Task Gate)
中断门(Interrupt Gate)
给出段选择符 (Segment Selector)、中断/异常程序的段内偏移量 (Offset)
通过中断门后系统会自动禁止中断
陷阱门(Trap Gate)
与中断门类似,但通过陷阱门后系统不会自动 禁止中断
调用门(Call Gate)
中断控制器(PIC或APIC)
负责将硬件的中断信号转换为中断向量,并引发 CPU 中断
最后更新于