您的位置:首页 > 其它

31-中断和异常

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

1. 中断

1.1 中断的概念

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

首先,中断由 CPU 外部的输入输出设备(硬件)发起,通常这被称为中断请求。

中断请求的目的是希望或者建议 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主动产生。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息