日期:2014-05-16  浏览次数:20659 次

linux内核--中断和中断处理(二)
中断通常被定义为一个事件,该事件改变处理器执行的指令。这样的事件与CPU芯片内外部硬件电路产生的电信号相对应。

中断通常分为同步中断异步中断

同步中断是当指令执行时由CPU控制单元 产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。

异步中断是由其他硬件设备 依照CPU时钟信号随机产生的

在intel微处理器手册中,把同步和异步终端分别称为异常和中断 。当然有时我们也用术语“中断信号 “指着两种类型

中断是由间隔定时器和I/O设备产生的 ,例如,用户的一次按键会引起一个中断

另一方面,异常是由程序的错误产生的,或者是由内核必须处理的异常条件产生的 。第一种情况下,内核通过发送一个每个Unix程序员都熟悉的信号来处理异常。第二种情况下,内核执行恢复异常需要的所有步骤,例如:缺页,或对内核服务的一个请求

I/O设备产生IRQ

1、中断信号的作用

中断信号提供了一种特殊的方式,使处理器转而去运行正常控制流之外的代码。当一个中断信号到达时,CPU必须停止它当前正在做的事情,并且切换到一个新的活动。 为了做到这一点,就要在内核态堆栈保存程序计数器的当前值,并把与中断类型相关的一个地址放入程序计数器。

中断处理与进程切换有一个明显的差异:由中断或异常处理程序执行的代码不是一个进程。更确切地说,它是一个内核控制路径,代表中断发生时正在运行的进程。

中断处理是由内核执行的最敏感的任务之一,因为它必须满足下列约束

[1]当内核正打算去完成一些别的事情时,中断随时会到来。因此,内核和目标就是让中断尽可能快地处理完,尽其所能把更多的处理向后推迟 。因此,内核响应中断后需要进行的操作分为两部分:关键而紧急的部分,内核立即执行;其余推迟的部分内核随后执行。

[2]因为中断随时会到来,所以内核可能正在处理其中的一个中断时,另一个中断又发生了。应该尽可能多地允许这种情况发生,因此这能维持更多的I/O设备处于忙状态。因此,中断处理程序必须编写成是相应的内核控制路径能以嵌套的方式执行。 当最后一个内核控制路径终止时,内核必须能恢复被中断进程的执行,或者,如果中断信号已导致了重新调度,内核能切换到另外的进程。

[3]尽管内核在处理前一个中断时可以接受一个新的中断,但在内核代码中还是存在一些临界区 ,在临界区中,中断必须被禁止。必须尽可能地限制这样的临界区,因为根据以前的要求,内核,尤其是中断处理程序,应该在大部分时间内以开中断的方式运行

2、中断和异常

Intel文档把中断和异常分为以下几类:

中断:

可屏蔽中断

I/O设备发出的所有中断请求都产生可屏蔽中断。可屏蔽中断可以处于两种状态:屏蔽的或非屏蔽的;一个屏蔽的中断只要还是屏蔽的,控制单元就忽略它。

非屏蔽中断

只有几个危急事件(如硬件故障)才引起非屏蔽中断。非屏蔽中断总是由CPU辨认。

异常

故障 :通常可以纠正

陷阱 :在陷阱指令执行后立即报告;主要用于是为了调试程序。在这种情况下,中断信号的作用是通知调试程序一条特殊指令已被执行。

异常中止 :发生一个严重的错误

编程异常 :在编程者发出请求时发生

每个中断和异常是由0-255之间的一个数来标识。因为一些未知的原因,Intel把这个8位的无符号整数叫做一个向量。非屏蔽中断的向量和异常的向量是固定的,而可屏蔽中断的向量可以通过对中断控制器的编程来改变。

[1]IRQ和中断

每个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线。所有现有的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连 ,可编程中断控制器执行下列动作:

(1)监视IRQ线,检查产生的信号

(2)如果一个引发信号出现在IRQ线上:

a.把接收到的引发信号转换成对应的向量

b.把这个向量存放在中断控制器的一个I/O端口,从而允许CPU通过数据总线读此向量

c.把引发信号发送到处理器的INTR引脚,即产生一个中断

d.等待,直到CPU通过把这个中断信号写进可编程中断控制器的一个I/O端口来确认它;当这种情况发生时,清INTR线。

(3)返回到第1步

IRQ线是从0开始顺序编号的,因此,第一条IRQ线通常表示成IRQ0.与IRQn并联的Intel的缺省向量是n+32.

可以有选择地禁止每条IRQ线。因此,可以对PIC编程从而禁止IRQ,也就是说,可以告诉PIC停止对给定的IRQ线发布中断,或者激活它们。禁止的中断时丢失不了的,它们一旦被激活,PIC就又把它们发送到CPU。这个特点被大多数中断处理程序使用,因为这允许中断处理程序逐次地处理同一类型的IRQ

有选择地激活/禁止IRQ线不同于可屏蔽中断的全局屏蔽/非屏蔽

[2]高级可编程中断控制器

为了充分发挥SMP体系结构的并行性,能够把中断传递给系统中的每个CPU至关重要。基于此理由,Intel从PentiumIII开始引入了一种名为I/O高级可编程控制器(I/O Advanced Programmable InterruptController APIC)



图4-1

[3]异常

80x86微处理器发布了大约20种不同的异常。内核必须为每种异常提供一个专门的异常处理程序。更多信息可以在Intel的技术文档中找到

表4-1由异常处理程序发送的信号

[4]中断描述符表

中断描述符(Interrupt Descriptor Table IDT)是一个系统表,它与每一个中断或异