Chinaunix首页 | 论坛 | 博客
  • 博客访问: 765405
  • 博文数量: 370
  • 博客积分: 2334
  • 博客等级: 大尉
  • 技术积分: 3222
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-06 16:56
文章分类

全部博文(370)

文章存档

2013年(2)

2012年(368)

分类: 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 屏蔽某个中断时产生)


阅读(2258) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~