linux 2.6源代码情景分析笔记之中断与异常5

来源:互联网 发布:服装设计网络班 编辑:程序博客网 时间:2024/05/16 11:36

中断处理依赖于中断类型,有三种主要的中断类型:
i/o中断:某些i/设备需要关注;相应的中断处理程序必须查询设备以确定适当的操作过程。
时钟中断:某种时钟(或者是一个本地apic时钟,或者是一个外部时钟)产生一个中断;这种中断告诉内核一个固定的时间间隔已经过去。这些中断大部分是作为i/o中断来处理的。
处理器间中断:多处理器系统中一个cpu对另一个cpu发出的一个中断。

I/O中断处理

i/o中断处理程序必须足够灵活以给多个设备同时提供服务。如在pci总线的体系结构中,几个设备可以共享同一个irq线。这就意味着仅仅中断向量不能说明所有问题。
中断处理程序的灵活性以两种不同的方式实现。
irq共享:中断处理程序执行多个中断服务例程(interrupt service routine,ISR).每个ISR是一个与单独设备(共享irq线)相关的函数。因为不可预先知道哪个特定的设备产生irq,因此,每个isr都被执行,以验证它的设备是否需要关注,如果是,当设备产生中断时,就执行需要执行的所有操作。
irq动态分配:一条irq线在可能的最后时刻才与一个设备驱动程序相关联;即时几个硬件设备并不共享irq线,同一个irq向量也可以由这几个设备在不同时刻使用。

linux把紧随中断要执行的操作分为三类:

紧急的(critical):这样的操作诸如pic应答中断,对pic或设备控制器重编程,或者修改由设备和处理器同时访问的数据结构。这些都能被很快地执行,而之所以说它们是紧急的是因为他们必须被尽快地执行。紧急操作要在一个中断处理程序内立即执行,而且是在禁止可屏蔽中断的情况下。
非紧急的(noncritical):这样的操作如:修改那些只有处理器才会访问的数据结构(如按下一个键后读扫描码)。这些操作也要很快地完成,它们由中断处理程序立即执行,但必须是在开中断的情况下。
非紧急可延迟的(noncritical deferrable)这样的操作诸如:把缓冲区的内容拷贝到某个进程的地址空间(如把键盘行缓冲区的内容发送到终端处理程序进程)。这些操作都可能被延迟较长的时间间隔而不影响内核操作,有兴趣的进程将会等待数据。非紧急可延迟的操作由独立的函数来执行。

不管引起中断的电路种类如何,所有的i/o中断处理程序都执行四个相同的基本操作:
1.在内核态堆栈中保存irq的数值和寄存器的内容。
2.为正在给irq线服务的pic发送一个应答,这将允许pic进一步发出中断。
3.执行共享这个irq的所有设备的中断服务例程(isr).
4.跳到ret_from_intr()的地址后终止。

中断向量

物理irq可以分配给32-238范围内的任何向量。linux使用向量128实现系统调用。
linux中的中断向量:
0-19(0x0-0x13)非屏蔽中断和异常
20-31(0x14-0x1f)intel保留
32-127(0x20-0x7f)外部中断(irq)
128(0x80)用于系统调用的可编程异常
129-238(0x81-0xee)外部中断(irq)
239(0xef)本地apic时钟中断
240(0xf0)本地apic高温中断
241-250(0xf0-0xfa)由linux留作将来使用
251-253(0xfb-0xff)处理器间中断
254(0xfe)本地apic错误中断
255(0xff)本地apic伪中断

为irq可配置设备选择一条线有三种方式:
1.设置一些硬件跳接器
2.安装设备时执行一个实用程序。这样的程序可以让用户选择一个可用的irq号,或者探测系统自身以确定一个可用的irq号。
3.在系统启动时执行一个硬件协议。外设宣布它们准备使用那些中断线,然后协商一个最终的数值以尽可能减少冲突。该过程一旦完成,每个中断处理程序都通过访问设备某个i/o端口的函数,来读取所分配的irq。

内核必须在启用中断前发现irq号与i/o设备之间的对应,否则内核在不知道哪个向量对应哪个设备(如scsi硬盘)的情况下,无法处理来自这个设备的信号。irq与i/o设备之间的对应实在初始化每个设备驱动程序时建立的。

原创粉丝点击