2

在过去的几天里,我正在研究很多关于 linux 第 10 章书 ldd3 的内容。我有一些疑问,请澄清他们。有些是我的分析,如有错误,请提出建议。

对于 ARM,有一个中断向量表地址用于 -- IRQ 中断 -- 0x00000018 然后芯片制造商可以为那里的硬件(如 USART、SPI、I2C、外部中断)提供单独的中断线,并将它们多路复用到单个 IRQ 线手臂。并有寄存器(他们选择)来确定哪个触发了中断。

此外,如果有一个可用于 GPIO 引脚电平变化中断的中断线。根据以下链接的单个中断线可以由不同设备驱动程序的许多处理程序共享。

fiq & irq handler -- arm 通常中断控制器是一个硬件单元,它将多条中断线复用在一起,生成单条线到 CPU。当中断发生时,控制器断言 IRQ 线。CPU 停止执行并通过 IRQ 向量(位置不同)跳转到中断处理程序。中断处理程序读取中断控制器上的寄存器以确定中断线,并调用正确的中断处理程序,然后清除中断 - 允许另一个中断发生。

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

https://unix.stackexchange.com/questions/47306/how-does-the-linux-kernel-handle-shared-irqs Linux 调用同一共享行的所有 intruppt 处理程序。

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

谁提供通用代码——IRQ 中断@0x00000018 地址——读取供应商特定寄存器以确定哪个中断线引发了 IRQ。然后告诉 linux 功能——调用为该 IRQ 行注册的所有共享中断处理程序?

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

4

2 回答 2

6

实际的中断处理由linux/arch/arm/kernel/entry-armv.S 设置。然后,解码和运行中断处理程序涉及一长串代码。

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

“哪个中断是哪个”的实际处理是在板的特定设置中配置的。我在这里给出了一个 omap2/omap3 板的示例(随机选择,因为我使用过这些板,但不在 Linux 中): linux/arch/arm/mach-omap2/irq.c

我希望这有帮助。

于 2012-12-29T14:02:26.323 回答
1

在 entry-armv.S 文件中,您可以找到填充 IRQ 行的代码,如下所示:

/*
 * 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_/include/entry-macro.S 中。你可以看到这个宏在不同的基于 arm 的机器上以不同的方式实现。这就是如何根据不同的硬件完成 IRQ 线路的识别。

于 2015-05-28T10:26:33.673 回答