Linux中PowerPC的中断原理分析(2)

部分成员解释:

status:或者是0,或者是从一个特定的集合中抽取的一个标志位(不太清楚)。这些标志位代表了IRQ的状态--是否被禁止,有关IRQ的设备当前是否正被自动检测等。

chip:是一个指向hw_interrupt_type(或者irq_chip)的指针。其中定义的函数是平台相关的(更具体的,是中断控制器相关的),很显然不同平台的中断控制器拥有不同的操作函数,比如enable, disable, mask, unmask某个中断的操作。从平台移植的角度,chip屏蔽了底层硬件的不同,使得在内核中某些代码成了平台无关性。但是对于不同平台的Linux,必须由BSP部分负责初始化irq_desc中的chip变量。

action:是一个指向由irqaction结构体组成的一个单向链表的头的指针。若一个IRQ只被一个中断源使用,那么该链表的长度就是1,当有多个设备共享一个中断源时,该链表就会由多个irqaction结构体组成,下面对此有介绍。

depth:irq_desc_t的当前用户的个数,主要用来保证事件正在处理的过程中IRQ不会被禁止。

从驱动程序开发者角度,不需要直接调用chip中的函数。但是在驱动程序request_irq时,因为要在irq_desc所对应的某一项中安装中断处理函数,request_irq函数原型如下:

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id)

其中第三个参数irqflags会影响到内核对chip中函数的调用,所以从这个角度而言,了解一些chip相关的中断enable/disable/mask/unmask对驱动程序员是有帮助的。

2、结构体:struct irqaction(include/linux/interrupt.h)

struct irqaction {       irq_handler_t handler;       unsigned long flags;       const char *name;       void *dev_id;       struct irqaction *next;       int irq;       struct proc_dir_entry *dir;       irq_handler_t thread_fn;       struct task_struct *thread;       unsigned long thread_flags;   };  

这个结构体包含了处理一种中断所需要的各种信息,它代表了内核接受到特定IRQ之后应该采取的操作。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwdfdx.html