grub2 - процесс загрузки linux systemd




Каков порядок загрузки встроенного драйвера Linux? (3)

Как мы можем настроить порядок загрузки встроенного драйвера (чтобы сначала был загружен какой-то встроенный модуль драйвера, а позже - зависимый модуль)?


Недавно у меня возникла эта проблема: мой драйвер зарядного устройства зависел от драйвера ADC, поэтому перед загрузкой драйвера драйвера ADC загрузился драйвер зарядного устройства и проверил наличие ADC-файла, который определен в файле DTS и должен быть инициализирован драйвером ADC. это решено путем изменения порядка модуля в драйверах / Makefile


Правильный порядок модулей и зависимости обрабатываются modprobe , даже в initrd .


Встроенные драйверы загружаться не будут, следовательно, встроенные. Их функции инициализации вызываются, и драйверы активируются, когда ядро ​​устанавливает себя. Эти функции инициализации вызываются в init/main.c::do_initcalls() . Все вызовы init классифицируются по уровням, которые определены в initcall_levels и include/linux/init.h

Эти уровни являются действительными символами, определенными в скрипте компоновщика ( arch/*/kernel/vmlinux.lds.* ). Во время компиляции ядра компоновщик собирает все функции, помеченные module_init() или другие *_initcall() , классифицирует уровни, помещает все функции на одном уровне вместе в одном месте и создает как массив указателей на функции.

Что do_initcall_level () делает во время выполнения, так это вызывает каждую функцию, указанную указателями в массиве. В do_initcall_level нет политики вызовов, кроме уровней, но порядок в массиве определяется во время соединения.

Итак, теперь вы можете видеть, что порядок инициации драйвера фиксирован во время соединения, но что вы можете сделать?

  1. поместите вашу функцию инициализации на более высокий уровень, или
  2. поместите драйвер вашего устройства на более высокую позицию в Makefile

Первое ясно, если вы прочитали выше. т.е.) вместо этого используйте early_initcall (), если это уместно.

Второму нужно немного больше объяснений. Причина, по которой порядок в Makefile имеет значение, заключается в том, как работает текущая система сборки ядра и как работают компоновщики. Короче говоря, система сборки берет все объектные файлы в obj-y и связывает их вместе. Он сильно зависит от среды, но существует высокая вероятность того, что компоновщик поместит первый объектный файл в obj-y по более низкому адресу, таким образом, вызванный ранее.

Если вы просто хотите, чтобы ваш драйвер вызывался раньше, чем другие драйверы в том же каталоге, это самый простой способ сделать это.





linux-device-driver