Linux 中断
中断硬件发起,外部设备与cpu通信的一种方式,相对于cpu轮询,中断是更好的方式。 中断设备与cpu的物理连接方式如下:
一般来说,外设并不直接与cpu相连接,而是通过一个叫’中断控制器’硬件连接。这个中断控制器是可被编程配置的。 所以又称它为’可编程中断控制器’(PIC)。外设向中断控制器发起中断,然后,’中断控制器’告诉cpu有中断到来。 cpu去读取中断控制器(PIC)产生的软中断号。 初始化需要配置PIC,配置内容包括:
- 中断触发的电信号类型(水平还是边沿触发)
- 将外设的引脚编号映射到cpu可见的软件中断号irq
- 屏蔽掉某些外部设备的中断触发
中断向量表
中断向量表是cpu的内部概念。当发生 ‘异常’ 或者 ‘内部中断’时,cpu会查看中断向量表该异常或者中断对应的处理函数地址。
通用中断处理函数
通常,当发生外部设备中断时,外设向中断控制器产生一个中断,中断控制器生成一个软件中断信号通知cpu。cpu发现是一个外部 中断,他会查询中断向量表中的某一表项去处理该中断。该表项对应的就是通用中断处理函数的入口地址。操作系统会提供这个通 用中断处理函数的定义。
通用中断处理函数的处理过程大致为:
- 获取软件中断号irq,一般使用汇编编写。
- 调用do_irq,c函数编写
所以,当一个外部设备产生中断后,到cpu响应该中断的流程如下:
- 外设触发一个中断
- 中断控制器(PIC)获取中断号并报告给cpu
- cpu得知这是一个外部中断,它去查找他的中断向量表,找到通用中断处理函数的地址
- cpu调用中断处理函数,通过向PIC查询软中断号
- 中断处理函数通过软中断号找到该外设注册的中断处理子函数(由驱动提供,在irq_desc数组中)
HARDIRQ 和 SOFTIRQ
当cpu在响应一个中断的时候,如果有新的中断到来了,如何处理呢? cpu为了处理这种情况,将中断处理分成了上半部和下半部。 HARDIRQ在中断关闭情况下执行,他的执行时间尽可能短 SOFTIRQ在中断开启的情况下执行。此时外部设备仍可以继续中断处理器,一般驱动程序可以将耗时部分放在此部分执行。