启动代码 - linux irq中断手臂中断



最近几天,我正在研究有关Linux第10章LDD3的很多信息。我有疑问,请澄清一下。有些是我的分析,请建议他们是否错了。

对于手臂,有一个中断的矢量表地址 - IRQ中断-0x00000018 然后,芯片制造商可以为usart,spi,i2c,外部中断等硬件提供单独的中断线,然后将它们多重到单个IRQ线。 并具有(他们选择的)登记册,以确定哪个发射了中断。

另外,如果示例有一个单个中断线可用于GPIO引脚级别更改中断。 根据下面的链接的单个中断线,可以由不同设备驱动程序的许多处理程序共享。

fiq&IRQ处理程序 - 手臂 通常,中断控制器是一个硬件单元,可将许多中断线路多连接在一起,从而生成CPU的单线。当中断时,控制器断言IRQ线。CPU停止执行并跳过IRQ矢量(位置变化)到中断处理程序。中断处理程序在中断控制器上读取寄存器,以确定中断线并调用正确的中断处理程序,然后清除中断 - 允许另一个发生。

http://www.makelinux.net/ldd3/chp-10-sect-2 在此链接中描述了如何注册中断处理程序。

https://unix.stackexchange.com/questions/47306/how-does-the-linux-kernel-kernel handle-shared-irqs Linux将所有Intruppt处理程序称为同一共享行。

我的问题是作为设备驱动程序程序员,我只在调用.... request_irq()。

谁为通用代码 - IRQ Intrupt @0x00000018地址 - 正在读取供应商特定寄存器以确定升级IRQ的供应商寄存器。然后告诉Linux功能 - 调用该IRQ行的所有共享中断处理程序的注册?

是为我们做这项工作的芯片组的GCC编译器启动代码吗?

实际中断处理由Linux/Arch/Arm/kernel/enter-Armv.s设置。然后,在解码和运行中断处理程序中涉及一条长长的代码链。

实际request_irq是通用代码,它设置了一个"描述符" IRQ_DESC,在linux/include/include/linux/irqdesc.h中定义。

在板的特定设置中配置了"哪个中断"的实际处理。我在这里举例说明了OMAP2/OMAP3板(随机选择,因为我已经与这些董事会合作,但在Linux中没有):Linux/Arch/Arm/Mach-omap2/irq.c

我希望这会有所帮助。

在入门臂文件中,您可以找到填充IRQ线的代码,如folows:

/*
 * Interrupt handling. Preserves r7, r8, r9
 */
.macro  irq_handler
get_irqnr_preamble r5, lr
1:  get_irqnr_and_base r0, r6, r5, lr
movne   r1, sp
@
@ routine called with r0 = irq number, r1 = struct pt_regs *
@
adrne   lr, BSYM(1b)
bne asm_do_IRQ

get_irqnr_and_base被认为是特定于机器的,因此包含在文件Arch/Arm/Mach_/includs/entry-macro.s中。您可以看到,对于基于不同的ARM机器的机器,该宏被实现了不同的方法。因此,这就是根据不同网络HWS完成IRQ线的标识。

最新更新