中断与异常(一)

本文只是建立关于中断的概念,其具体的过程与源码分析在随后的文章中会有说明

说明:由于泛指的中断与硬件引起的中断都叫做中断,中断(泛指)指中断的总称,中断指指硬件引起的中断。


一、内核响应事件

CPU在正常运行的过程中,由于预选安排或发生了各种随机的内部或外部事件,例如指令执行除0出现错误,敲击了键盘等,系统需要对这样的事件做出响应。下面是响应常用的两种方法:

1.轮询:处理器定期地主动执行程序来对设备的状态进行查询。由于处理器要执行一定的程序,就会浪费一定的时钟周期,而且很多情况下会出现CPU询问但却其实不用处理。所以这部分时钟周期就浪费了。

2.中断(泛指):硬件设备需要CPU的时候主动向CPU发信号来通知处理器处理事件。这个就不用CPU操心了,只有在事件确实需要处理的时候才会去处理,这样就不存在上面那种浪费时钟周期的行为了。


二、中断(泛指)的分类

1.异常:指令执行时由控制单元产生的,也就是由软件产生的;例如:指令执行除0

2.中断:硬件设备需要内核的响应产生的,也就是由硬件产生的;例如:敲击键盘


由于对于系统的不同的中断和异常分别由不同的处理,所以对其进行了下面的分类:

三、中断的分类

1.可屏蔽中断:可以由IF标志位屏蔽的中断。当寄存器中IF=1时CPU才对其进行响应,否则CPU不对其进行响应。由CPU的INRT引脚接入

2.不可屏蔽中断:不能由IF标志位屏蔽的中断。CPU必须对其进行响应由CPU的NMI引脚接入(这个一般比较少,所以后面的处理不讨论这一种)。


四、异常的分类

1.故障:80386中故障这种异常是可以纠正的,也就是说导致异常的指令会在异常处理程序执行(纠正)后被重新正确执行。故障可能发生在指令开始执行之前,也可能在指令执行期间。如果在指令执行期间检测到故障,那么中止故障指令,并把指令的操作数恢复为指令开始执行之前的值。也就是说故障发生后要恢复到指令执行前的状态,这可保证故障指令的重新执行得到正确的结果。当控制转移到故障处理程序时,保存引起故障的指令处的CS及EIP的值。这样,在故障处理程序把故障排除后,执行IRET返回到引起故障的程序继续执行时,刚才引起故障的指令可重新得到执行。例如,在一条指令的执行期间,如果发现段不在缓冲区,那么停止该指令的执行,并通知系统产生段故障,对应的故障处理程序可通过将该段加载到缓冲区的方法来排除故障,然后原指令就可成功执行。

2.陷阱:在引起异常的指令之后,把异常情况通知给系统的一种异常,在异常处理程序执行之后执行引起陷阱的指令的下一条要执行的指令故障可能发生在指令执行完成后。当控制转移到异常处理程序时,所保存的断点CS及EIP的值指向引起陷阱的指令的下一条要执行的指令。因此,陷阱处理程序并不是总能根据保存的断点,反推确定出产生异常的指令。在转入陷阱处理程序时,引起陷阱的指令应正常完成。软中断指令、单步异常。

3.异常终止:在系统出现严重情况时,通知系统的一种异常。引起中止的指令是无法确定的。产生中止时,正执行的程序不能被恢复执行。系统接收中止后,处理程序要重新建立各种系统表格,并可能重新启动操作系统。


五、异常过程

CPU在每条指令执行完的时候,就会检查是否发生了异常如果发生异常,进入异常的处理,确认中断向量,保存中断上下文,处理”紧急“事件,退出中断,根据需要进行相应的处理。

1.从PIC的一个I/O端口确认中断向量(总线可以传递),这个可以根据中断向量来找到中断处理程序的入口。

2.准备中断执行的环境。

3.在内核栈中保存寄存器的值

4.执行异常处理程序。

5.调到ret_from_exception()的地址后终止

6.退出中断,根据是否需要调度或者其他事情来进行相应处理。

7.恢复执行的环境


五、中断过程

首先当硬件设备需要CPU的相应时,硬件会将一个电信号通过IRQ(中断请求)线传给PIC(可编程中断控制器),然后PIC将这个电信号根据接入的引脚的不同将其翻译成不同的中断向量i(这个就是用来区分不同的中断),然后将这个向量写入PIC的一个I/O端口中,从而允许CPU通过数据总线读取这个响应;然后触发CPU的INTR引脚,产生一个中断;CPU在每条指令执行完的时候,就会检查INTR引脚是否发生了中断,如果发生,清INTR线,进入中断的处理(粗略描述):

1.从PIC的一个I/O端口确认中断向量(总线可以传递),这个可以根据中断向量来找到中断处理程序的入口。

2.准备中断执行的环境。

3.在内核栈中保存IRQ和寄存器的值

4.给为IRQ服务的PIC发送一个应答,并允许PIC进一步发出中断

5.执行共享这个IRQ的所有设备的中断服务例程(将可延迟的操作挂起,随后再处理)。

6.调到ret_from_intr()的地址后终止

7.退出中断,根据是否需要调度或者其他事情来进行相应处理。

8.恢复执行的环境

在这个过程中值得提到的是,中断是随时可能产生的,而CPU必须马上对它进行处理,这个并不排除CPU正工作在非常重要的代码上,例如:工作在内核态并持有重要的锁,这个会导致其他CPU上想持有该锁的程序等待,这个就会造成系统性能的损失,所以为防止这种情况的恶化,我们不得不尽快地处理完中断。对此中断的很多处理可以分为“紧急的”和可延迟的,我们将紧急的部分在中断处理程序中完成,然后将可延迟部分要做的处理函数挂到某个数据结构上(这个就是软中断,tasklet和工作队列),然后在合适的时机对其进行处理。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值