ARM 特定的 IRQ 初始化

use*_*586 3 arm linux-kernel

我试图了解 ARM 架构特定的 IRQ 初始化(向量表和第一级中断处理程序)。

我查了一下start_kernel() init/main.c -----> setup_arch() arch/arm/kernel/setup.c,,没有找到与IRQ初始化相关的源码。我认为init_IRQ()里面调用的start_kernel()是建立内核IRQ处理基础设施。

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

art*_*ise 5

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


机器结构init_irq有回调;这些通常在板文件中定义。例如,通过宏imx6sl_init_irq()调用irqchip_init()机器描述,DT_MACHINE_START该宏是.arch.info.init部分中的machine_desc。该代码在启动初期就会被调用,并且是使 IRQ 硬件正常工作所必需的;它通常包括时钟机制。

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

机器必须在设备树中声明 GIC。这与 irq-gic.c 中调用 的表条目相匹配gic_of_init()。这些表用于通过of_irq_init()硬件地址和中断编号来初始化 GIC 控制器。即,这采用 irq-gic 驱动程序并给出具体设备Note2

start_kernel()那么现在您在 中找到的调用init_IRQ()的代码应该有意义吗?它会看起来像,

 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.
Run Code Online (Sandbox Code Playgroud)

由于 Linux 被组织为子系统,所以结构到处都是,因此您拥有驱动程序基础结构(都需要中断)、设备树(用于获取数据)、初始化和中断代码(irqchip)。DT 或设备树功能旨在减少 Linux 中板级特定代码的数量。包含的 imx6 alone-lite 设备树示例显示了数据的编码方式。该文本被编译为从引导加载程序传递的扁平设备树二进制文件(或附加到映像)。

注 1: 设备树有多个名称。 OF用于按照原始 PowerPC 规范的开放固件。作为“扁平化设备树”的FDT,主要由 u-boot 人员提出。也只是DT。因此,当您看到以下前缀之一 OF、DT、FDT 时,通常与“设备树”有关。

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