中断详解
异常和中断的概念
由CPU内部产生的意外事件叫做异常,有些教材中称为"内中断"。由来自CPU外部的设备向CPU发出的中断请求被称为中断。通常用于检测信息的输入和输出
异常和中断的分类
异常的分类
异常时由CPU内部产生的意外事件,分为故障中断和程序性异常。硬故障中断时由应连线出现异常引起的,如存储器校验错/总线错误等。程序性异常也成为软件中断,是指在CPU内部因为执行指令而引起的异常事件。如整除0、溢出、断点、单步跟踪、非法指令、栈溢出、地址越界、缺页等
- 故障
- 指在引起故障的指令启动后、执行结束前被检测到的异常事件,如内存的缺页和缺段、除数为0等,对缺页缺段等异常事件,处理后回到故障发生的指令继续执行,而非法操作码、除数为0则不能返回到原断点执行,必须终止进程的执行
- 自陷
- 自陷也称陷阱或者陷入,是预先安排的一种异常事件,就像预先设定的陷阱一样,在操作系统中用于用户态与内核态之间的切换,比如当用户程序想要执行系统调用时,需要通过一条自陷指令进入到内核态
故障异常和自陷异常属于程序性异常(软件中断)
- 自陷也称陷阱或者陷入,是预先安排的一种异常事件,就像预先设定的陷阱一样,在操作系统中用于用户态与内核态之间的切换,比如当用户程序想要执行系统调用时,需要通过一条自陷指令进入到内核态
- 终止
- 如果在执行指令的过程中发生了使计算机无法继续执行的硬件故障,如控制器出错、存储器校验错、总线错误等,那么程序无法继续执行,只能终止,此时调出异常服务程序来重启系统,这种异常与故障和自陷不同,不是由特定指令产生的,而是随机发生的。
终止异常和外中断属于硬件中断
- 如果在执行指令的过程中发生了使计算机无法继续执行的硬件故障,如控制器出错、存储器校验错、总线错误等,那么程序无法继续执行,只能终止,此时调出异常服务程序来重启系统,这种异常与故障和自陷不同,不是由特定指令产生的,而是随机发生的。
中断的分类
中断是指来自CPU外部,与CPU执行指令无关的事件引起的中断,包括I/O设备发出的I/O中断,时钟中断或者其他的特殊事件等。外部设备通过特定的中断请求信号线向CPU提出中断请求,CPU每执行完一条指令就检查中断请求信号线,如果检测到中断请求,就进入中断响应周期。
中断分为可屏蔽中断和不可屏蔽中断
- 可屏蔽中断
指通过屏蔽中断请求线INTP向CPU发出的中断请求。CPU可以通过在中断控制器中设置相应的屏蔽字来屏蔽它或者不屏蔽它。 - 不可屏蔽中断
指通过专门的不可屏蔽中断请求线NMI向CPU发出的中断请求。通常时非常紧急的硬件故障,如电源掉电等,这类中断请求信号不可以被屏蔽,CPU需要快速处理这类紧急事件
中断的作用
- CPU与I/O设备并行工作
- 硬件故障处理
- 实现人机联系:在计算机工作过程中,如果用户要干预机器,如查看计算的中间结果,了解机器的工作状态,给机器下达临时性的命令等。在没有中断系统的计算机里这些功能几乎是无法实现的。
- 实现多道程序和分时操作
- 实现实时处理
- 实现应用程序和操作系统的联系
- 多处理机系统各处理机间的联系
异常和中断的区别
中断和异常本质上是一样的,但是他们有以下两个重要的不同点
- “缺页”或者“溢出”等异常事件是由特定指令在执行过程中产生的,而中断不和任何指令相关联,也不阻止任何指令的完成
- 异常的检测由CPU自身完成,不必通过外部的某个信号通知CPU。对于中断,CPU必须通过中断请求先获取中断源的信息,才能知道是哪个设备发生了何种中断
此外,根据识别中断服务程序地址的方式,可以分为向量中断和非向量中断;根据中断处理的程序是否可以被打断,可以分为单重擢内阁段和多重中断
CPU如何发现中断请求
简单来说,就是在每条指令的中断周期,扫描中断请求标记触发器INTR,看看是否有设备发出了中断请求。
那么中断和异常是如何给CPU一个具体的中断号的呢?
有一个设备叫做可编程中断控制器,它有很多的 IRQ 引脚线,接入了一堆能发出中断请求的硬件设备,当这些硬件设备给 IRQ 引脚线发一个信号时,由于可编程中断控制器提前被设置好了 IRQ 与中断号的对应关系,所以就转化成了对应的中断号,把这个中断号存储在自己的一个端口上,然后给 CPU 的 INTR 引脚发送一个信号,CPU 收到 INTR 引脚信号后去刚刚的那个端口读取到这个中断号的值。
从总线的角度来看,这里“给CPU的INTR引脚发送一个信号”走的是控制总线,而“CPU 收到 INTR 引脚信号后去刚刚的那个端口读取到这个中断号的值”走的是数据总线
中断判优
异常和中断的响应过程
CPU响应中断之后,通过某些操作,转去执行中断服务程序,这些操作是由硬件直接实现的,他们将它称为中断隐指令,中断隐指令并非指令系统的一条真正的指令,而是一种虚拟的说法,本质上是硬件的一系列自动操作,它完成的操作如下:
- 关中断。CPU 响应中断后,首先要保护程序的断点和现场信息,在保护断点和现场的过程中,CPU 不能响应更高级中断源的中断请求。否则,若断点或现场保存不完整,在中断服务程序结束后,就不能正确地恢复并继续执行现行程序。
- 保存断点。为保证在中断服务程序执行完后能正确地返回到原来的程序,必须将原程序的断点(指令无法直接读取的PC和PSW的内容)保存在或特定寄存器中。
- 注意异常和中断的差异:异常指令通常并没有执行成功,异常处理后要重新执行,所以其断点通常是当前指令的地址。中断的断点则是下一条指令的地址。
- 引出中断服务程序。识别中断源,将对应的服务程序入口地址送入程序计数器PC。有两种方法识别中断源:硬件向量法和软件查询法。本节主要讨论比较常用的向量中断。
中断向量
中断识别分为向量中断和非向量中断两种。非向量中断即软件查询法,第 5 章已介绍。
每个中断源都有一个唯一的类型号,每个中断类型号都对应一个中断服务程序,每个中断服务程序都有一个入口地址,即中断向量,CPU 必须找到入口地址。把系统中的全部中断向量集中存放到存储器的某个区域内,这个存放中断向量的存储区就称为中断向量表。
中断向量表的数据结构
CPU 响应中断后,通过识别中断源获得中断类型号,然后据此计算出对应中断向量的地址;再根据该地址从中断向量表中取出中断服务程序的入口地址,并送入程序计数器 PC,以转去执行中断服务程序,这种方法被称为中断向量法,采用中断向量法的中断被称为向量中断。
注意:中断请求和响应信号是在 I/O 总线的控制线上传送的。CPU 响应某一中断后,就从数据线上获取该中断源的中断类型号,并据此计算对应中断向量在中断向量表中的位置。
中断的处理过程
注意:现场和断点,这两类信息都不能被中断服务程序破坏。由于现场信息用指令可直接访问因此通常在中断服务程序中通过指令把它们保存到栈中,即由软件实现。而断点信息由 CPU在中断响应时自动保存到栈或指定的寄存器中,即由硬件实现。
中断服务程序
多重中断
在 CPU 执行中断服务程序的过程中,若又出现了新的优先级更高的中断请求,而 CPU 对新的中断请求不予响应,则称这种中断为单重中断。若 CPU 暂停现行的中断服务程序,转去处理新的中断请求,则称这种中断为多重中断,也称中断嵌套。
参考文献
王道课本及PPT