目录
承前文,本文从中断路由、优先级、数据结构和标识意义等方面对Linux内核中断进行一步的解析。
1.中断路由
Aset affinity flow
GIC文中有提到SPI类型中断的路由控制器寄存器为GICD_IROUTER,设置该寄存器即配置了中断的路由方式。内核中irq_set_affinity_hint、__irq_set_affinity、irq_set_affinity_locked等都可以设置对应的中断的路由即affinity,以irq_set_affinity_hint为例来说明affinity设置的过程,对应代码流程中如上图。
irq_set_affinity_hint 最终会调用到GIC的中的gic_set_affinity函数,通过该函数将系统需要设置的中断的affinity值设置到该中断对应的GICD_IROUTER寄存器;当该中断触发时GIC会根据该中断对应的GICD_IROUTER寄存器值,将该中断路由到指定的PE去处理。
affinify值即CPU对应的MPIDR_EL1(关于MPIDR_EL1寄存器解释,看一查看另一文章 CSDARM处理器 -- ARM64 MPIDR_EL1寄存器-CSDN博客CSD),Linux系统中有多处记录该中断affinify值对应的cpu number,如上图的三处:
irq_desc->affinity_hint 系统要设置的该中断可路由到的CPU,可以是某个特定的
CPU或者是CPU的集合,该CPU可以是unpluged state。
irq_data->irq_common_data->effective_affinity 最终设置到该中断
GICD_IROUTER寄存器的affnity值对应的CPU,特定某个CPU,该CPU
是系统要设置的该中断可以路由的CPU集合的中的一个。
irq_data->irq_common_data->affinity 同irq_desc->affinity_hint,系统要设
置的该中断可路由到的CPU。