首先说明。答案是否定的,内核中断号能够与硬件中断号不一致。可是这是个无聊的问题。。
有用价值不大。可是却能够引起对内核软件中断号与硬件中断号关系的思考。
两者的关系我认为能够从中断的初始化和分发过程来一探到底。
这里就从ARM PPC MIPS 3款主流嵌入式处理器架构的内核代码框架中来分析下他们中断的初始化和分发过程。
一 中断的初始化
对于中断初始化,在系统启动过程中,这3款处理器架构的内核软件框架中都会有对应的中断初始化函数.
内核启动函数start_kernel中会调用init_IRQ来进行中断初始化,该函数在不同处理器平台代码有不同实现。实如今arch/xxx/kernel/irq.c中。
对于arm处理器,init_IRQ调用相应设备描写叙述符machine_desc的init_irq。
对于ppc处理器。init_IRQ调用相应设备描写叙述符machdep_calls的init_IRQ。
对于mips处理器,init_IRQ调用arch_init_irq。
终于调用的中断初始化函数是在板级支持包中实现。由于中断控制器属于处理器核的外设。
所以能够看出,中断初始化的调用关系:
通用函数start_kernel -----> 处理器平台级函数init_IRQ -----> 板级中断初始化函数init_irq等
板级中断初始化函数完毕2件事情,其一,中断控制器初始化。
其二。中断描写叙述符irq_desc的初始化。
中断控制器初始化就不细说了。
这里我们主要关心软件上中断描写叙述符的处理。
内核对于中断的管理,最重要的作用结构就是irq_desc。在kernel/irq/irqdesc.c中:
struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = { [0 ... NR_IRQS-1] = { .handle_irq = handle_bad_irq, .depth = 1, .lock = __RAW_SPIN_LOCK_UNLOCKED(irq_desc->lock), } };
NR_IRQS由不同处理器平台的板级支持包来定义,irq_desc数组成员代表每个中断号和对应的处理函数。
所以irq_desc[NR_IRQS]就是硬件中断控制器中断号表在内核的表征。
有个前提。这里是在不配置CONFIG_SPARSE_IRQ内核选项的情况下,irq_desc[NR_IRQS]用数组形式静态分配中断描写叙述符表。编译时即确定irq_desc数组大小。
假设配置CONFIG_SPARSE_IRQ则动态分配irq_desc以节省内存。这是还有一套机制,这里就不细说了。
板级中断初始化函数中完毕其所使用全部中断号相应的irq_desc的初始化,主要是设置中断的一级处理函数。通常是handle_level_irq。函数实如今kernel/irq/chip.c中。