Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1417256
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: LINUX

2013-05-03 12:50:54

中断和异常:(一)概述

概述

中断通常被定义为一个事件,该指令改变处理器执行指令的顺序。这样的事件与CPU芯片内外部硬件电路产生的电信号相对应。中断提供了一种特殊的方式,使处理器转而去运行正常控制流之外的代码,当一个中断到达时,CPU必须停止当前正在做的事情,并且切换到一个新的活动。为了做到这一点,就要在内核态堆栈中保持程序计数器的当前值(即eip和cs寄存器的内容),并把与中断类型相关的一个地址放入程序计数器中。
中断通常分为同步(synchronous)中断和异步(asynchronous)中断,在Intel微处理器手册中,把同步和异步中断分别称为异常(exception)和中断(interrupt)。同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断;异步中断是由其他硬件设备依照CPU时钟信号随机产生的。(如无特殊说明,后文中的中断指的是同步中断)
中断由间隔定时器和I/O设备产生;异常由程序错误或者内核必须处理的异常条件产生,第一种情况内核通过发送信号来处理异常,第二种情况内核执行恢复异常所需要的所有步骤(如缺页)。

分类

中断:
可屏蔽中断(maskable interrupt)
I/O设备发出的所有中断请求(IRQ)都产生可屏蔽中断。可屏蔽中断可以处于两种状态:屏蔽的和非屏蔽的;若处于屏蔽状态,控制单元会忽视它。
不可屏蔽中断(nonmaskable interrupt)
只有几个危急事件才会引起非屏蔽中断
异常:
处理器探测异常(processor-detected exception)
当CPU执行指令时探测到的一个反常条件所产生的异常,可进一步分为三组,这取决于CPU控制单元产生异常时和保存在内核态堆栈eip寄存器的值。
故障(fault)
通常可以纠正,一旦纠正,程序就可以在不失连贯性的情况下重新开始执行。保存的eip的值是引起故障的指令地址,因此,当异常处理程序终止时,那条指令会被重新执行。(如缺页)
陷阱(trap)
在陷阱指令执行后立即报告,内核把控制权返还给程序后就可以继续它的执行而不失连贯性。保存在eip中的值是随后要执行的指令地址。只有当没有必要重新执行已终止指令时,才触发陷阱。陷阱的主要用途是为了调试程序,在这种情况下,中断信号的作用是通知调试程序一条特殊指令已被执行,一旦用户检查到调试程序所提供的数据,他就可能要求被调试的程序从下一条指令开始执行。
异常中止(abort)
发生一个严重的错误;控制单元出了问题,不能在eip寄存器中保存引起异常的指令所在的确切位置。异常中止用于报告严重的错误,受影响的进程通常被强制终止。
编程异常(programmed exception)
在编程着发出请求时发生,由int或int3指令出发,当into(检查溢出)和bound(检查地址出界)指令检查的条件不为真时,也引起编程异常。控制单元将编程异常当作先陷阱来处理。编程异常通常也叫做软中断(software interrupt),这种异常有两种常用的用途:执行系统调用以及给调试程序通报一个特定的事件。
每个中断和异常由0~255之间的一个数来标识,Inter把这个8位的无符号整数叫做一个向量(vector),非屏蔽中断的向量和异常的向量是固定的,可屏蔽中断的向量可以通过对中断控制器的编程来改变。
阅读(999) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~