1.irq_desc 内核中记录一个irq_desc的数组,数组的每一项对应一个中断或者一组中断(使用同一中断号)。一句话,irq_desc几乎记录所有中断相关的东西,这个结构是中断的核心。其中包括两个重要的数据结构irq_chip和irqaction。 include/linux/irq.h struct irq_desc irq_desc[NR_IRQS]; /*
我们用irq_request函数注册中断时,主要做两件事情,根据中断号生成一个irqaction结构并添加到irq_desc中的action结构链表,另一方面做一些初始化的工作,其中包括设置中断触发方式,设置一些irq_chip结构中没有初始化的函数为默认,开启中断,设置GPIO口为中断输入模式。 特别说明irqflags,若设置了IRQF_DISABLED (老版本中的S...
intsetup_irq(unsigned int irq,struct irqaction*new){int shared=0;unsigned long flags;struct irqaction*old,**p;irq_desc_t*desc=irq_desc+irq;...spin_lock_irqsave(&desc->lock,flags);p=&desc->action;if((old=*p)!=NULL){if(!(old->flags&new->flags&SA_SHIRQ)){spin_unlock_irqrestore(...
就是下图中的irq_num Linux内核中定义了名为irq_desc的中断例程描述符表来描述中断服务例程,每一个irq_desc对象数组中的下标就是软中断号。其中的struct irqaction对象描述了这个中断服务例程的中断的具体信息。 //include/linux/irqdesc.h 40 struct irq_desc { 41 struct irq_data irq_data; 42 unsigned int...
中断分为IRQ和FIQ5.分析内核中断运行过程,以及中断3大结构体:irq_desc、irq_chip、irqaction(详解)不...
Linux内核将所有的中断统一编号,使用一个irq_desc结构数组来描述这些中断;每个数组项对应一个中断,也可能是一组中断,它们共用相同的中断号,里面记录了中断的名称、中断状态、中断标记(比如中断类型、是否共享中断等),并提供了中断的低层硬件访问函数(清除、屏蔽、使能中断),提供了这个中断的处理函数入口,通过它可以调用...
1.irq_desc数组 irq_desc结构体在include/linux/irqdesc.h中定义,主要内容如下图: 每一个irq_desc数组项中都有一个函数:handle_irq,还有一个action链表。要理解它们,需要先看中断结构图: 外部设备1、外部设备n共享一个GPIO中断B,多个GPIO中断汇聚到GIC(通用中断控制器)的A号中断,GIC再去中断CPU。那么软件处理...
前面说过, 8259A中断控制器 由两片 8259A 风格的外部芯片以 级联 的方式连接在一起,每个芯片可处理多达 8 个不同的 IRQ(中断请求),所以可用 IRQ 线的个数达到 15 个。如下图: 8259A 在内核中每条IRQ线由结构体 irq_desc_t 来描述, irq_desc_t 定义如下: ...
下面介绍一下 irq_desc_t 结构各个字段的作用: status: IRQ线的状态。 handler: 类型为 hw_interrupt_type 结构,表示IRQ线对应的硬件相关处理函数,比如 8259A中断控制器 接收到一个中断信号时,需要发送一个确认信号才会继续接收中断信号的,发送确认信号的函数就是 hw_interrupt_type 中的 ack 函数。
首先在函数irq_to_desc中根据发生中断的中断号,去取出它的 irq_desc 中断描述结构,然后调用 generic_handle_irq_desc: staticinlinevoidgeneric_handle_irq_desc(struct irq_desc*desc){desc->handle_irq(desc);} 这里调用了 handle_irq 函数。 所以,在上述流程中,还需要分析 irq_to_desc 流程: ...