分类: LINUX
2012-05-27 19:00:21
这是我们疯狂内核系列的中断处理专题开山之作,中断,广义的来说通常被定义为一个事件,该事件触发改变处理器执行指令的顺序。狭义地来说,针对
80x86体系,中断被分为中断和异常,又叫同步中断和异步中断。注意广义的中断和狭义的中断千万不要混淆,以后我的博文中所有所谓的“中断”二字,就是
指狭义的中断,即Linux处理80x86异步中断的细节。我们首先必须好好理清一下80x86体系中,中断和异常的区别:
中断:由其他硬件依照CPU时钟信号随机产生。
异常:由CPU本身执行指令时,CPU控制单元在一条指令终止之后产生。
更进一步,Intel文档中又把中断和异常继续进行了细分:
中断:
1. 可屏蔽中断:当中断被屏蔽,则CPU控制单元就忽略它。这里提一下,所有的IRQ中断都是可屏蔽中断。
2. 非可屏蔽中断:总由CPU辨认并处理。所以,其为非常紧急的硬件故障。
异常:
1. 处理器探测到得异常
(1)故障(fault)
通常可以纠正,所谓的“纠正”,就是在执行一条指令时发现故障,转而执行对应的异常处理程序;一旦纠正完毕,即异常处理程序完成,程序就可以在不失连贯性
的情况下,重新执行刚才那条发现故障的指令。保存在eip寄存器中的值是引起故障的指令地址,因此,当异常处理程序终止时,那条指令会被重新执行。
(2)陷阱(trap)
陷阱的主要用途是为了调试程序。在这种情况下,eip中存放的不是引起陷阱的指令,而是下一个即将执行的指令。陷阱的中断信号的作用是通知调试程序一条特殊指令已被执行。一旦用户检查到调试程序所提供的数据,他就可能要求被调试程序从下一条指令重新开始执行。
(3)异常终止(abort)
发生一个严重错误;CPU控制单元出了问题,不能在eip寄存器中保存引起异常指令所在的确切位置。所以,除了强制终止受影响的进程外,别无选择。
2. 软中断
软中断由程序员通过int或int3指令触发的。当into(检查溢出)和bound(检查地址出界)指令检查的条件不为真时,也会引起软中断。CPU把软中断作为陷阱来处理,也叫编程异常。这样的异常有两种常用的用途:执行系统调用以及给调试程序通报一个特定的事件。
每个中断和异常是由0~255之间的一个数来标识的,我们把这个八位无符号整数叫做向量。非屏蔽中断的向量和异常的向量是固定的,而可屏蔽中断的向量可以通过对中断控制器的编程来改变。
向量范围 |
用途 |
0-19 (0x0 -0x13) |
非屏蔽中断和异常 |
20-31 (0x14 -0x1f) |
Intel 保留 |
32-127 (0x20 -0x7f) |
外部中断 (IRQs) |
128 (0x80) |
用于系统调用的可编程异常(重点) |
129-238 (0x81 -0xee) |
外部中断 (IRQs) |
239 (0xef) |
本地APIC 时钟中断(重点) |
240 (0xf0 ) |
本地APIC 高温中断(在Pentium 4 模型中引入) |
241-250 (0xf1 -0xfa) |
由Linux 留作将来使用 |
251-253 (0xfb -0xfd) |
处理器间中断 |
254 (0xfe ) |
本地APIC 错误中断(当本地APIC 检测到一个错误条件时产生) |
255 (0xff ) |
本地APIC 伪中断(CPU 屏蔽某个中断时产生) |