1、结构体:struct irq_desc(include/linux/irq.h)
|
部分成员解释:
status:或者是0,或者是从一个特定的集合中抽取的一个标志位(不太清楚)。这些标志位代表了IRQ的状态--是否被禁止,有关IRQ的设备当前是否正被自动检测等。
chip:是一个指向hw_interrupt_type(或者irq_chip)的指针。下面对此有介绍。
action:是一个指向由irqaction结构体组成的一个单向链表的头的指针。若一个IRQ只被一个中断源使用,那么该链表的长度就是1,当有多个设备共享一个中断源时,该链表就会由多个irqaction结构体组成,下面对此有介绍。
depth:irq_desc_t的当前用户的个数,主要用来保证事件正在处理的过程中IRQ不会被禁止。
2、结构体:struct irqaction(include/linux/interrupt.h)
|
主要成员:
handler—该指针所指向的函数就是在中断服务程序,当中断发生时内核便会调用这个指针指向的函数。
flags:该标志位可以是0,也可以是:SA_INTERRUPT(表示此中断处理程序是一个快速中断处理程序,在2.6中默认情况下没有这个标志)SA_SAMPLE_RANDOM(表示这个中断对内核池有贡献,我理解为就是在中断时产生一些随机数,这些随机数被用来作为加密密匙,因为中断是随机发生的,如果某种中断是有频率的被产生,那么它就不要设置此标志位,还有就是那种设备容易被攻击也不应该设置此标志位)SA_SHIRQ(此标志位表示允许多个中断服务程序共享一个中断号,如不设则一个程序对应一个中断线)。
mask:在x86上不会用到。
name:产生中断的硬件的名字.
dev_id:该标志位主要在共享中断号时使用,即你设置flags=SA_SHIRQ时,有多个中断服务程序共享一个中断号时,内核就需要知道在用完中断程序后该删除那个中断服务程序。不共享时此成员为null。
next:如果flags=SA_SHIRQ,那么这就是指向对列中下一个struct irqaction结构体的指针,否则为空。
irq:不用说这就是中断号了。
3 结构体:struct hw_interrupt_type(include/linux/irq.h)
|
typename:给相应的控制器起一个便于理解的名字。
startup:允许从给定的控制器的IRQ所产生的事件。(基本上与enable相同)
shutdown:禁止从给定的控制器的IRQ所产生的事件。(基本上与disable相同)
以上三个结构体的关系可以用下面一张图来说明:

数组irq_desc_t用来描述中断的相关信息,它有225项,每一项代表一个中断源,其中字段irq(注意这个字段就是上图中的handler字段),此结构体用来描述中断控制器,action字段用来描述处理一种中断所需要的各种信息,它代表了内核接受到特定IRQ之后应该采取的操作。
本文深入探讨了中断处理相关的数据结构,包括struct irq_desc、struct irqaction和struct hw_interrupt_type。介绍了它们的成员和作用,阐述了如何描述中断源、中断控制器以及处理中断时的行动。并详细解析了中断状态、共享中断以及中断服务程序的实现。

被折叠的 条评论
为什么被折叠?



