Это сложно отследить, так как код вызывается через раздел 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 в дереве устройств. Это соответствует по сравнению с a table entry in 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.
Структура повсюду, потому что Linux организована как подсистемы, поэтому у вас есть инфраструктура драйвера (все нужно прерывания), дерево устройств (для получения данных), инициализация и код прерывания (irqchip). Функциональность DT или устройств направлена на уменьшение количества конкретного кода в Linux. Пример imx6 solo-lite device tree include показывает, как данные закодированы. Этот текст получает скомпилированный в двоичный файл сплющенного дерева устройств, который передается из загрузчика (или прикрепляется к изображению).
Примечание 1: Дерево устройств вызывается несколькими именами. OF для открыть прошивку согласно оригинальной спецификации PowerPC. Как FDT для «сплющенного дерева устройств», в основном, людьми-загрузчиками. Также как только DT. Поэтому, когда вы видите один из следующих префиксов: OF, DT, FDT, это часто связано с «деревом устройств».
Примечание 2: Устройство представляет собой конкретное железо. Драйвер - это код для управления устройством. Linux выделяет память и предоставляет это код драйвера. Таким образом, один кусок кода может обрабатывать несколько устройств (в этом случае контроллеры прерываний). Это объектно-ориентированная концепция, и ARM хорошо справится с этим: адрес + смещение использование блока загрузки/хранения.
Большое спасибо за информацию. Теперь я понял поток. – user3693586