1、中断相关的数据结构描述
对于每一个中断都可以使用irq_desc结构体来描述,如下
struct irq_desc {
irq_flow_handler_t handle_irq;
struct irq_chip *chip;
void *handler_data;
void *chip_data;
struct irqaction *action; /* IRQ操作列表 */
unsigned int status; /* IRQ状态 */
unsigned int depth; /* 嵌套停用irq */
unsigned int irq_count; /* 用于检测错误的中断*/
unsigned int irqs_unhandled;
...
const char *name;
} ____cacheline_internodealigned_in_smp;
- 其中要注意,handle_irq与后面提到的handler不是一个,handle_irq是站在一个更高的角度来描述中断,例如中断的触发方式是电平触发还是边沿触发。
- chip结构负责使用其提供的特定于控制器的方法,进行处理中断所必需的一些底层操作。
- action提供一个操作链,由中断通知的设备驱动程序,可以将与之相关的处理程序函数放置在此处
irq_chip抽象出了一个IRQ控制器的具体特征,可用于内核的体系结构无关部分。它提供的函数用于改变IRQ的状态,即中断控制器实例。
struct irq_chip {
const char *name;
unsigned int (*startup)(unsigned int irq);
void (*shutdown)(unsigned int irq);
void (*enable)(unsigned int irq);
void (*disable)(unsigned int irq);
void (*ack)(unsigned int irq);
void (*mask)(unsigned int irq);
void (*mask_ack)(unsigned int irq);
void (*unmask)(unsigned int irq);
void (*eoi)(unsigned int irq);
void (*end)(unsigned int irq);
void (*set_affinity)(unsigned int irq, cpumask_t dest);
...
int (*set_type)(unsigned int irq, unsigned int flow_type);
...
该结构需要考虑内核中出现的各个IRQ实现的所有特性。因而,一个该结构的特定实例,通常只定义所有可能方法的一个子集。
irqaction结构的定义如下,每个处理程序函数