我正在尝试了解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内核。
答案 0 :(得分:4)
这很难跟踪,因为某些代码是通过 section magic 调用的,而其他代码是通过回调和其他机制调用的。此外,我们有历史机制和设备树初始化 Note1 。
init_irq
of the machine structure中有一个回电;这些通常在电路板文件中定义。例如,来自机器描述的imx6sl_init_irq()
calls irqchip_init()
通过DT_MACHINE_START
宏machine_desc in the .arch.info.init section。这段代码在启动时很早就被调用,需要使IRQ硬件正常工作;它通常包括计时机制。
Linux支持多个 irqchip 控制器。例如,在某些ARM系统上有多个GIC芯片。如果有超过1020个中断源,则需要这样做。同样,GPIO硬件通常是一种辅助IRQ芯片,用于启用/禁用GPIO中断。
机器必须在设备树中声明GIC。这与调用gic_of_init()
的{{3}}相匹配。这些表由a table entry in irq-gic.c用于初始化具有硬件地址和中断编号的GIC控制器。也就是说,这需要irq-gic驱动程序并提供具体设备 Note2 。
现在,您在start_kernel()
中找到的代码of_irq_init()
应该有意义吗?它看起来像,
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中特定于板的代码量。示例init_IRQ()显示了数据编码的方式。此文本将编译转换为压缩的设备树二进制文件,该二进制文件从引导加载程序传递(或附加到映像)。
注1:设备树由多个名称调用。 OF 用于开放固件,符合原始PowerPC规范。作为“扁平设备树”的 FDT ,主要由u-boot人员提供。也只是 DT 。因此,当您看到以下前缀之一OF,DT,FDT时,它通常与“设备树”有关。
注2:设备是具体的硬件。驱动程序是处理设备的代码。 Linux分配内存并将其提供给驱动程序代码。通过这种方式,一段代码可以处理多个设备(在这种情况下是中断控制器)。它是一个面向对象的概念,ARM将通过地址+偏移使用加载/存储单元来很好地处理它。