内核的代码位于kernel/irq目录下
内核提供的相关接口
与注册系统中断处理函数相关接口
int set_irq_chip(unsigned int irq, struct irq_chip *chip)
void __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, const char *name)
与注册用户中断处理函数相关接口
static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)
int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn,
unsigned long irqflags, const char *devname, void *dev_id)
void free_irq(unsigned int irq, void *dev_id)
打开和关闭本地cpu中断
local_irq_enable()
local_irq_disable()
local_irq_save(flags)
local_irq_restore(flags)
打开和关闭某个中断
void enable_irq(unsigned int irq)
void disable_irq(unsigned int irq)
结构体
struct irq_desc
每个中断号或者一组中断号(如级联的中断)对应一个struct irq_desc, 所以根据相应的中断号,可以获取对应的中断描述结构irq_desc
struct irq_chip
irq_chip结构定义了各种中断相关的处理行为,如开启或禁止中断以及中断服务完成的之后对相关的中断寄存器进行处理(清中断等)
struct irq_chip这个结构体很重要,里面的ack,enable,disable,mask,unmask,都与具体的中断控制器相关
kernel/irq中的enable_irq,disable_irq都是调用的chip->中的这些函数。
struct irqaction
是一个单链表,所以一个中断号能对应执行多个用户中断处理函数,比如说usb中断来了,他会依次执行以usb中断号注册的EHCI和ohci的用户中断处理函数
/proc文件系统接口
/proc/interrupts
读取interrupts会依次显示irq编号,每个cpu对该irq的处理次数,中断控制器的名字,irq的名字,以及驱动程序注册该irq时使用的名字。
/proc/irq
/proc/irq/n/smp_affinity
分配某个中断给某个cpu
echo 3 > /proc/irq/n/smp_affinity //将中断号n分配给cpu1和cpu2
另外用户进程irqbalance服务可以实现中断均衡处理