中断/异常
中断/异常,是操作系统的驱动力,就好比汽车的发动机、飞机的引擎
是什么?
中断是CPU对系统发生的某个事件作出的一种反应
当中断发生时,CPU暂停正在执行的程序,保留现场后自动转去执行相应事件的处理程序,处理完成后返回断点,继续执行被打断的程序
为什么?
中断的引入,为了支持CPU和设备之间的并行操作
当CPU启动设备进行输入/输出后,设备便可以独立工作,CPU转去处理与此次输入/输出不相关的事情;当设备完成输入/输出后,通过向CPU发中断报告此次输入/输出的结果,让CPU决定如何处理以后的事情(及时处理设备发来的中断请求)
异常的引入,表示CPU执行指令时本身出现的问题 (“问题”为广泛含义)
如算术溢出、除零、取数时的奇偶错,访存地址时越界或执行了“陷入指令”等,这时硬件改变了CPU当前的执行流程,转到相应的错误处理程序或异常处理程序或执行系统调用(可使OS捕获用户程序提出的服务请求,也可防止用户程序执行过程中的破坏性活动)
Summary
>> 中断(外中断):外部事件,正在运行的程序不期望的(在CPU之外,打断了CPU)
a. I/O中断
-- 在键盘上按下Ctrl + C
-- 网络上来了一个包,网卡接收到一个新的数据包
-- 打印机打印结束了
-- 读盘结束了
b. 时钟中断
-- 设定的定时器到了
-- CPU运行的程序时间片到了
c. 硬件故障
-- 笔记本电池快没电了,报警
>> 异常(内中断):由正在执行的指令引发
a. 系统调用
b. 页故障/页错误
-- 缺页异常
c. 保护性异常
-- 一块内存空间标记成只读,当要做一个写操作,(操作和权限)就冲突了
d. 断点指令
-- 访问一个内存空间,访问的区域地址越界了
e. 其它程序性异常
-- 算术溢出
-- 读内存的时候,奇偶校验错
怎么办?
从两个角度来剖析中断/异常机制工作原理:
1. 硬件做什么? -- 中断响应
捕获中断源发出的中断/异常请求,以一定方式响应,将处理器控制权交给特定的处理程序(这个过程由中断硬件部件完成)
2. 软件怎么做? -- 中断处理程序
识别中断/异常类型并完成相应的处理
重点:区分哪些是软件(操作系统)事先做好的工作,哪些是硬件在执行过程中要做的规定的流程
一、设计操作系统时,为每一类中断/异常事件编好相应的处理程序
二、在操作系统初始化的过程中,把中断向量表设置好(PC、PSW)
三、CPU何时响应中断?(硬件)
1. 在CPU每条指令执行周期的最后时刻扫描中断寄存器(CPU控制部件中设有中断寄存器),查看是否有中断信号?
2. CPU处理完当前指令后检测到中断(允许中断),判断出中断来源并向相关设备发确认信号。中断硬件将该中断触发器内容按规定编码送入PSW的相应位,称为中断码。处理器状态被切换到内核态
3. 中断硬件部件保存现场,保存内容(PSW、PC)到系统堆栈里面(保存被中断程序的重要上下文环境)(#关键寄存器的信息)
4. 中断硬件根据中断码查中断向量表,得到对应的中断处理程序(具体步骤见 X86 处理器对中断/异常的支持)
5. 把中断处理程序的入口地址等相关信息推送到相应的寄存器(PC)
6. 下一个指令周期开始,执行中断处理程序
7. 若无中断信号(或禁止中断),继续执行下一条指令
a. 中断向量表(软硬件结合的数据结构)
中断向量:一个内存单元,存放中断处理程序入口地址和程序运行时所需的处理机状态字
中断向量表b. Linux中的中断向量表
Linux中的中断向量表四、执行中断处理程序(软件)
1. 保存相关寄存器信息(现场信息)到系统堆栈(#其它寄存器的信息)
2. 分析中断/异常的具体原因(哪一类中断/异常,比如打印机,是正常打印结束还是缺纸还是缺墨)
3. 根据具体原因执行对应的处理功能(比较具体的工作)
4. 恢复现场,返回被事件打断的程序
五、中断处理结束(硬件)
中断处理结束时,CPU检测到中断返回指令,从系统堆栈中恢复被中断程序的上下文环境,CPU状态恢复成原来的状态,PSW和PC恢复成中断前的值,CPU开始一个新的指令周期
Summary
软件提前设置好,硬件部件来执行
X86 处理器对中断/异常的支持
两个概念:
1. 中断向量表(Interrupt Vector)(实模式)
2. 中断描述符表(Interrupt Descriptor Table)(保护模式)
采用门(gate)描述数据结构表示中断向量
四种类型门描述符:
a. 任务门(Task Gate)
b. 中断门(Interrupt Gate)
-- 给出段选择符(Segment Selector)、中断/异常程序的段内偏移量(Offset)
-- 通过中断门后系统会自动禁止中断
c. 陷阱门(Trap Gate)
-- 与中断门类似,但通过陷阱门后系统不会自动禁止中断
d. 调用门(Call Gate)
X86处理器对中断的支持通过IDTR寄存器可以得到中断描述符表的地址,中断描述符表的每一行叫做中断描述符或门描述符
中断描述符是64位,里面有门类型(是中断门还是陷阱门)、特权级DPL,通过中断描述符,得到了一个段选择符
段选择符其实就是一个索引(在GDT表中的索引还是在LDT表中的索引),它也有特权级
中断处理程序的相关信息放在全局描述符表,通过用段选择符在全局描述符表中查找得到段描述符
段描述符中也有相应的权限(属性),主要关注的是段的基地址
有了段的基地址,有了在中断描述符当中的偏移量,就得到中断服务程序的入口地址
X86处理器对中断的支持中断/异常的硬件处理过程:
1. 确定与中断或异常关联的向量i
2. 通过IDTR寄存器找到IDT表,获得中断描述符(表中的第i项)
3. 从GDTR寄存器获得GDT的地址;结合中断描述符中的段选择符,在GDT表获取对应的段描述符;从该段描述符中得到中断或异常处理程序所在的段基址
4. 特权级检查
5. 检查是否发生了特权级的变化,如果是,则进行堆栈切换(必须使用与新的特权级相关的栈)
6. 硬件压栈,保存上下文环境;如果异常产生了硬件出错码,也将它保存在栈中
7. 如果是中断,清IF位
8. 通过中断描述符中的段内偏移量和段描述符中的基地址,找到中断/异常处理程序的入口地址,执行其第一条指令
Summary:
中断,多道程序操作系统的基点,没有中断机制程序只能从头一直运行结束才有可能开始运行其他程序
(完)