最近几天我正在学习很多关于linux第10章书ldd3的知识。我有一些疑问请澄清他们。有些是我的分析,如果他们错了,请提出建议。启动代码 - linux的IRQ中断手柄ARM
对于ARM有一个中断向量表地址 - 中断IRQ - 0x00000018 然后,芯片的制造商可具有用于有一个独立的中断线路硬件等USART,SPI,I2C,外部中断 - 并将它们复用到ARM的单个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编译器的芯片组启动代码为我们做这项工作吗?