中断和异常


中断和异常的目的:

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

中断通常是CPU外部的输入输出设备(硬件)触发的,供外部设备通知CPU有事情需要处理,因此又叫做中断请求,
中断请求的目的是希望CPU暂时停止当前正在执行的程序,转去让CPU去处理中断请求对应的中断处理例程(ISR-interrupt service routine).

我们知道有些任务是不可打断的,为了防止CPU被打扰,可以通过执行CLI(clear interrupt)指令来清除标志寄存器(EFLAGS)的IF位,使CPU暂时不受打扰。但是这样只能让CPU不受可屏蔽的中断(maskable interrupt)的打扰, 一旦有不可屏蔽中断non-maskable interrupt->NMI发生,CPU任然要去处理,但是我们知道NMI很少,而且不可打断的代码很少,所有一般不用考虑太多。
可屏蔽中断是由CPU的INTR引脚触发
不可屏蔽中断是CPU的NMI引脚触发(此处最好看微机原理这本书比较好,IRQ那里也不错)

值得一提的是中断机制让外设和CPU有了很好的通信功能,成了外设你有事你打断我的机制,所以有中断机制的硬件是很厉害的
他可以随意打断CPU


在硬件级别,中断由一块专门的芯片来管理,称为中断控制器,它负责分配中断资源和管理各个中断发出的中断请求。也就是IRQ
但我们的IRQ是怎么实现的呢,他和中断号建立了链接,最终也走的是IDT服务例程
IR0 时钟
IR1 键盘
IR3 IR4 串口1 串口2 串口通信还是微机原理与接口技术那本书(8251等的实现)
IR6 软盘驱动(很少了)
一个IRQ可以由多喝设备对象共享,不多说了,这是PCI总线允许多个PCI设备共享一个中断请求信号,在windows驱动开发那本书上
在设备对象那部分有类似的总线共享


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

一: 程序错误,当CPU执行程序指令遇到操作数有错误或者检测到指令规范中定义的非法情况,前者比如除数是0,这是错误异常,
后者比如用户层执行特权指令什么的。比如函数不能直接用RING0

二:来自某些特殊指令,这些指令就是为了产生异常,比如INT3指令,(具体INT3的实现可以看我上篇堆软件断点的解释)是断点异常
是为了切到调试器上

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

比较:

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

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


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

陷阱Trap:与错误异常不同,当CPU报告陷阱类异常时,导致该异常的指令已经执行完毕,压入栈的CS和EIP(也就是异常处理的返回地址)是导致该异常的指令执行后紧接着执行的下一条指令,所以执行的是下一条要执行的指令,下一条不一定是相邻指令,比如跳转指令。导致陷阱类的异常通常也是可以无损失的恢复执行的,比如INT 3导致的断点异常,可以从调试器返回到程序继续执行。

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


错误类型之页错误(缺页,算法有FIFO,LRU算法等)

原文地址:https://www.cnblogs.com/L-Sunny/p/8435924.html