linux中断子系统(四) - 内核提供的相关接口和结构体

时间:2022-08-30 18:34:33

内核的代码位于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)

void enable_irq(unsigned int irq)
void disable_irq(unsigned int irq)
void disable_irq_nosync(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