Linux kernel 特定于ARM的IRQ初始化

Linux kernel 特定于ARM的IRQ初始化,linux-kernel,arm,Linux Kernel,Arm,我试图理解ARM的特定于体系结构的IRQ初始化(向量表和一级中断hadler) 我检查了start\u kernel()init/main.c----->setup\u arch()arch/arm/kernel/setup.c,,但找不到与IRQ初始化相关的源代码。我认为在start\u kernel()内部调用的init\u IRQ()是为了建立内核IRQ处理基础设施 我指的是3.14内核。您能否帮助理解特定于ARM的IRQ初始化(ARM GIC初始化)。我指的是CortexA15的3.14

我试图理解ARM的特定于体系结构的IRQ初始化(向量表和一级中断hadler)

我检查了
start\u kernel()init/main.c----->setup\u arch()arch/arm/kernel/setup.c,
,但找不到与IRQ初始化相关的源代码。我认为在
start\u kernel()
内部调用的
init\u IRQ()
是为了建立内核IRQ处理基础设施


我指的是3.14内核。您能否帮助理解特定于ARM的IRQ初始化(
ARM GIC初始化
)。我指的是CortexA15的3.14内核。

这很难跟踪,因为一些代码是通过部分magic调用的,而另一些代码是通过回调和其他机制调用的。此外,我们还有历史机制和设备树初始化说明1


有一个电话回电;这些通常在线路板文件中定义。例如,通过
DT\u machine\u START
宏从机器描述开始,该宏是一个。这段代码在启动的很早就被调用,并且是使IRQ硬件工作所必需的;它通常包括时钟机制

Linux支持多个irqchip控制器。例如,在一些ARM系统上有多个GIC芯片。如果有超过1020个中断源,则需要这样做。同样,GPIO硬件通常是一种辅助IRQ芯片,用于启用/禁用GPIO中断

机器必须在设备树中声明GIC。这与_init()的哪个调用
gic_匹配。这些表由用于使用硬件地址和中断编号初始化GIC控制器。也就是说,这需要irq gic驱动程序,并给出一个具体的设备2

那么现在您在
start\u kernel()
中找到的代码,哪些调用应该有意义?看起来

 start_kernel     ->
  init_IRQ        ->
   machine_desc->init_irq (machine version)
    irqchip_init  ->
     of_irq_init  -> via *device tree* for address data
      gic_of_init -> actual controller initialization.
这种结构到处都是,因为Linux是作为子系统组织的,所以您有驱动程序基础结构(都需要中断)、设备树(获取数据)、初始化和中断代码(irqchip)。DT或设备树功能旨在减少Linux中特定于板的代码量。示例显示了如何对数据进行编码。该文本被编译成一个扁平的设备树二进制文件,该文件从引导加载程序(或附加到映像)传递

注1:设备树由多个名称调用OF适用于原始PowerPC规范规定的开放固件。对于“扁平设备树”,主要由u-boot人员使用。也就是DT。因此,当您看到以下前缀之一,of,DT,FDT时,它通常与“设备树”有关


注2:设备是一块具体的硬件。驱动程序是处理设备的代码。Linux分配内存并将其提供给驱动程序代码。通过这种方式,一段代码可以处理多个设备(本例中为中断控制器)。这是一个面向对象的概念,ARM可以很好地处理加载/存储单元的地址+偏移量使用。

非常感谢您提供的信息。现在我明白了流程。