在Linux 2.6.19中,中断描述符结构体irq_desc在include/linux/irq.h文件中定义,其源代码如下:
struct irq_desc { irq_flow_handler_t handle_irq; struct irq_chip *chip; void *handler_data; void *chip_data; struct irqaction *action; unsigned int status; unsigned int depth; unsigned int wake_depth; unsigned int irq_count; unsigned int irqs_unhandled; spinlock_t lock; #ifdef CONFIG_SMP cpumask_t affinity; unsigned int cpu; #endif #if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE) cpumask_t pending_mask; #endif #ifdef CONFIG_PROC_FS struct proc_dir_entry *dir; #endif const char *name; } ____cacheline_aligned; |
其中,handle_irq指向该中断请求的处理函数;chip、handler_data和chip_data用以访问发出中断请求的硬件;action指向响应该IRQ的动作链表中的第一项;status用以描述IRQ线的状态;depth和wake_depth指出该IRQ线上的中断嵌套深度;irq_count和irqs_unhandled指出该IRQ线上中断请求的数目和未处理的中断数目,如果最近10万个中断中仅处理了不超过100个,则内核会自动禁止来自该线的所有中断请求;lock为访问PIC的同步锁;affinity和cpu在多处理器上使用,用以实现负载均衡;pending_mask用以挂起被负载均衡的中断;dir指向/proc/irq目录项;name为/proc/interrupts输出项的目录。