2012-12-29 79 views
2

最近几天我正在学习很多关于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编译器的芯片组启动代码为我们做这项工作吗?

回答

6

实际的中断处理由linux/arch/arm/kernel/entry-armv.S设置。那么解码和运行中断处理程序就会涉及很长的代码链。

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

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

我希望这有助于。

1

在入门armv。S档,可以定位所述代码用于填充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宏被suposed是机器特定,因此包含在文件arch /臂/ mach_ /包含/入门macro.S。 您可以看到,对于基于arm的不同机器,这个宏以不同的方式实现。所以这就是如何根据不同的HW来完成IRQ线的识别。