在过去的几天里,我正在研究很多关于 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 编译器启动代码为我们做这项工作吗?