对于异常处理来说,内核只要给引起异常的进程发送一个Unix信号就能处理大多数异常。然后内核的工作就是延迟下一个动作,知道进程接收到该信号。关于异常处理,内核并没有执行多少任务,因而异常处理非常迅速。
这种方怯并不适合中断,因为经常会出现一个进程(例如,一个请求数据传输的进程)被挂起好久后中断才到达的情况,因此,一个完全无关的进程可能正在运行。所以,给当前进程发送一个Unix信号是毫无意义的.
中断处理依赖于中断类型,三种主要的中断类型:
I/O中断:
些110设备需要关注,相应的中断处理程序必须查询设备以确定适当的操作过程.
时钟中断:
某种时钟{或者是一个本地APIC时钟,或者是一个外部时钟)产生一个中断,这种中断告诉内核一个固定的时间间隔已经过去。这些中断大部分是作为1/0中断来处理的$
处理期间中断:
多处理器系统中一个CPU对另一个CPU发出一个中断.
中断处理程序的灵活性是以两种不同的方式实现的:
IRQ共享:
中断处理程序执行多个中断服务例程(interruptservice routine. ISR). 每个ISR是一个与单独设备(共享IRQ线)相关的函数。因为不可能预先知道哪个特定的设备产生IRQ. 因此,每个ISR都被执行,以验证它的设备是否需要关注,如果是,当设备产生中断时,就执行需要执行的所有操作。
动态分配:
一条IRQ线在可能的最后时刻才与一个设备驱动程序相关联,例如,软盘设备的IRQ线只有在用户访问软盘设备时才被分配。这样,即使几个硬件设备并不共享
IRQ线.同一个IRQ向量也可以由这几个设备在不同时刻使用
Linux把紧随中断要执行的操作分为三类:
1)紧急的
2)非紧急的
3)非紧急可延迟的
不管引起中断的电路种类如何,所有的I/O中断处理程序都执行四个相间的基本操作:
1. 在内核态堆栈保存IRQ的值和寄存器的内容.
2. 为正在给IRQ线服务的PIC发送一个应答,过将允的二PICill .步发出巾断。
3. 执行共享这个IRQ的所有设备的中断服务例程(lSR)。
4. 跳到ret_from_intr()的地址后终止。
二恶
原文:http://blog.csdn.net/windeal3203/article/details/44594207