在linux kernel中,对于每一个外设的IRQ都用struct irq_desc来描述,我们称之中断描述符(struct irq_desc)。linux kernel中会有一个数据结构保存了关于所有IRQ的中断描述符信息,我们称之中断描述符DB(上图中红色框图内)。当发生中断后,首先获取触发中断的HW interupt ID,然后通过irq domain翻译成IRQ nuber,然后通过I...
此外,需要注意的是,在旧内核中,IRQ number和硬件的连接有一定的关系,但是,在引入irq domain后,IRQ number已经变成一个单纯的number,和硬件没有任何关系。 三、中断描述符数据结构 1、底层irq chip相关的数据结构 中断描述符中应该会包括底层irq chip相关的数据结构,linux kernel中把这些数据组织在一起,形成struct i...
此外,需要注意的是,在旧内核中,IRQ number和硬件的连接有一定的关系,但是,在引入irq domain后,IRQ number已经变成一个单纯的number,和硬件没有任何关系。 三、中断描述符数据结构 1、底层irq chip相关的数据结构 中断描述符中应该会包括底层irq chip相关的数据结构,linux kernel中把这些数据组织在一起,形成struct i...
这时候,GPIO的中断在中断控制器的状态寄存器中只有一个bit,因此所有的GPIO中断只有一个IRQ number,在该通用GPIO中断的irq handler中进行deduplex,将各个具体的GPIO中断映射到其相应的IRQ number上。如果你是一个足够老的工程师,应该是经历过这个阶段的。 随着linux kernel的发展,将interrupt controller抽象成irqchip这个...
/kernel5.15/drivers/irqchip/irq-gic-v3.c 在1244 和 1246 行,1246 行就是在 online 的 CPU 中选中一个,1263 行写入到寄存器中,GIC 会读取这个寄存器,是哪个 CPU,然后将中断发给这个CPU。中间的函数很简单,大家可以自己看。 中断状态机 对于GIC-V2 而言,中断的状态机由 Distributor 维护,每个中断都有一个...
在Linux Kernel中,对于每一个外设的IRQ都有统一的描述方式,在Linux Kernel中用struct irq_desc来表示,称为中断描述符,保存了中断相关的信息,如IRQ_Number、硬件中断号、中断服务例程等: struct irq_desc { ... struct irq_data irq_data; // 保存软件中断号、irq domain等信息 ......
linux kernel中会有一个数据结构保存了关于所有IRQ的中断描述符信息,我们称之中断描述符DB(上图中红色框图内)。当发生中断后,首先获取触发中断的HW interupt ID,然后通过irq domain翻译成IRQ nuber,然后通过IRQ number就可以获取对应的中断描述符。调用中断描述符中的highlevel irq-events handler来进行中断处理就OK了...
/kernel5.15/drivers/irqchip/irq-gic-v3.c 在1244 和 1246 行,1246 行就是在 online 的 CPU 中选中一个,1263 行写入到寄存器中,GIC 会读取这个寄存器,是哪个 CPU,然后将中断发给这个CPU。中间的函数很简单,大家可以自己看。 中断状态机 对于GIC-V2 而言,中断的状态机由 Distributor 维护,每个中断都有一个...
ARM64中,当外部中断发生时, 会调用el1_irq, 在上述20行中,会call handle_arch_irq. 此为一个函数指针, 在GIC中断控制器在做初始化时设置的. 而中断来临时,handle_domain_irq会被call 到. //kernel/irq/handle.cint__initset_handle_irq(void(*handle_irq)(stuct pt_regs*)){ ...
linux interrupt framework虽然支持中断共享,但是它并不会协助解决识别问题,它只会遍历该IRQ number上注册的irqaction的callback函数,这样,虽然只是一个外设产生的中断,linux kernel还是把所有共享的那些中断handler都逐个调用执行。为了让系统的performance不受影响,irqaction的callback函数必须在函数的最开始进行判断,是否是...