每一个“丑得人神共愤”的泡妞高 手都有一颗坚忍的心,这证明了人类 在绝境中毫不妥协的求生精神,反正丑都丑了,索性放开手脚大干一场,这就叫“无产阶级失去的是锁链,得到的是全世界”
2013年(130)
分类: LINUX
2013-05-02 15:28:10
中断通常被定义为一个事件,该指令改变处理器执行指令的顺序。这样的事件与CPU芯片内外部硬件电路产生的电信号相对应。中断提供了一种特殊的方式,使处理器转而去运行正常控制流之外的代码,当一个中断到达时,CPU必须停止当前正在做的事情,并且切换到一个新的活动。为了做到这一点,就要在内核态堆栈中保持程序计数器的当前值(即eip和cs寄存器的内容),并把与中断类型相关的一个地址放入程序计数器中。
中断通常分为同步(synchronous)中断和异步(asynchronous)中断,在Intel微处理器手册中,把同步和异步中断分别称为异常(exception)和中断(interrupt)。同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断;异步中断是由其他硬件设备依照CPU时钟信号随机产生的。(如无特殊说明,后文中的中断指的是同步中断)
中断由间隔定时器和I/O设备产生;异常由程序错误或者内核必须处理的异常条件产生,第一种情况内核通过发送信号来处理异常,第二种情况内核执行恢复异常所需要的所有步骤(如缺页)。
中断:
可屏蔽中断(maskable interrupt)异常:
I/O设备发出的所有中断请求(IRQ)都产生可屏蔽中断。可屏蔽中断可以处于两种状态:屏蔽的和非屏蔽的;若处于屏蔽状态,控制单元会忽视它。不可屏蔽中断(nonmaskable interrupt)
只有几个危急事件才会引起非屏蔽中断
处理器探测异常(processor-detected exception)每个中断和异常由0~255之间的一个数来标识,Inter把这个8位的无符号整数叫做一个向量(vector),非屏蔽中断的向量和异常的向量是固定的,可屏蔽中断的向量可以通过对中断控制器的编程来改变。
当CPU执行指令时探测到的一个反常条件所产生的异常,可进一步分为三组,这取决于CPU控制单元产生异常时和保存在内核态堆栈eip寄存器的值。
故障(fault)编程异常(programmed exception)
通常可以纠正,一旦纠正,程序就可以在不失连贯性的情况下重新开始执行。保存的eip的值是引起故障的指令地址,因此,当异常处理程序终止时,那条指令会被重新执行。(如缺页)陷阱(trap)
在陷阱指令执行后立即报告,内核把控制权返还给程序后就可以继续它的执行而不失连贯性。保存在eip中的值是随后要执行的指令地址。只有当没有必要重新执行已终止指令时,才触发陷阱。陷阱的主要用途是为了调试程序,在这种情况下,中断信号的作用是通知调试程序一条特殊指令已被执行,一旦用户检查到调试程序所提供的数据,他就可能要求被调试的程序从下一条指令开始执行。异常中止(abort)
发生一个严重的错误;控制单元出了问题,不能在eip寄存器中保存引起异常的指令所在的确切位置。异常中止用于报告严重的错误,受影响的进程通常被强制终止。
在编程着发出请求时发生,由int或int3指令出发,当into(检查溢出)和bound(检查地址出界)指令检查的条件不为真时,也引起编程异常。控制单元将编程异常当作先陷阱来处理。编程异常通常也叫做软中断(software interrupt),这种异常有两种常用的用途:执行系统调用以及给调试程序通报一个特定的事件。