31-中断和异常

在经过了大量的学习和实践后,今天终于可以抛出这个沉重的话题了。不少操作系统相关的书籍喜欢很早就在书上给什么是中断,什么是异常下了一个让人抓狂的定义,可是这对初学者来讲真的不适合。

1. 中断

1.1 中断的概念

看到这个标题,你肯定联想到之前我们学习过的中断门、中断描述表这些概念。如果把中断门玩溜了,肯定也知道int N这条汇编指令。不过我想告诉你的是,通过int N指令完成的中断,并不叫中断,相反,它属于异常范畴。到这里请不要慌,接下来请认真阅读,什么才是中断。

  1. 首先,中断由 CPU 外部的输入输出设备(硬件)发起,通常这被称为中断请求。
  2. 中断请求的目的是希望或者建议 CPU 能够暂停正在执行的指令,转而去执行中断处理程序(安装在中断描述符表中)。

如此一来,你应该能想明白int N指令不是中断了,因为这条指令引起的中断来源于 CPU 内部,这很重要。

而你所熟知的时钟中断,那就是名副其实的中断请求了。

1.2 可屏蔽中断与不可屏蔽中断

80x86有两条中断请求线:

  • 非屏蔽中断线,称为NMI(NonMaskable Interrupt)

  • 可屏蔽中断线,称为INTR(Interrupt Require)

1.2.1 可屏蔽中断

之前讲过,中断请求的目的是 希望或者建议 CPU去处理相应的例程,当然 CPU 也完全可以不用理会这些建议。这种完全可以被 CPU 忽视掉的中断称为可屏蔽中断。具体做法就是修改 CPU 中的 EFLAGS 寄存器中的 IF 位。

当 IF 位为 1 的时候,表示 CPU 当前可以接受中断请求并进行处理,当 IF 位为 0 的时候,任何中断请求都将会被 CPU 忽略。

可以通过指令 cli 来忽略中断请求,即置 IF = 0. 可以通过指令 sti 来响应中断请求,即置 IF = 1.

在硬件级,可屏蔽中断是由一块专门的芯片来管理的,通常称为中断控制器。它负责分配中断资源和管理各个中断源发出的中断请求。为了便于标识各个中断请求,中断管理器通常用IRQ(Interrupt Request) 后面加上数字来表示不同的中断.

比如:在Windows中 时钟中断的IRQ编号为0 也就是:IRQ0


这里写图片描述

既然时钟中断是外部请求,那么它一定也是可以屏蔽的啦。在单核模式下运行多线程程序时,可以关闭中断请求,从而不响应时钟中断,这种方法可以实现原子操作。不过多核的话这种方法就失效了,需要采取其它手段。

1.2.1 不可屏蔽中断

不可屏蔽中断的中断号在windows中安装在IDT表的2号位置。它不会受 IF 位的影响。当这种中断发生时,无论如何 CPU 都要去处理。

断电就是一种不可屏蔽中断。还有没有其它的不可屏蔽中断,我也表示不知道。

2. 异常

异常通常是CPU在执行指令时检测到的某些错误,比如除0、访问无效页面等。不同于中断,异常来源于 CPU 内部,它是 CPU 主动产生的。

中断与异常的区别:

  • 中断来自于外部设备,是中断源(比如键盘)发起的,CPU是被动的.

  • 异常来自于CPU本身,是CPU主动产生的.

  • INT N虽然被称为“软件中断”,但其本质是异常。EFLAG的IF位对INT N无效。

3. 总结

无论是中断还是异常,它们的处理程序都安装在了 IDT 表中,而中断和异常的最本质区别就是来源问题,中断是CPU外部产生,而异常是CPU主动产生。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值