it-swarm.com.ru

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

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

22
Dien Nguyen

Встроенные драйверы не будут загружены , следовательно, встроенными. Их функции инициализации вызываются, и драйверы активируются, когда ядро ​​устанавливает себя. Эти функции инициализации вызываются в init/main.c::do_initcalls(). Все вызовы инициализации классифицируются по уровням, которые определены в 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 по более низкому адресу, поэтому он вызывается раньше.

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

36
Yasushi Shoji

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

2
Ignacio Vazquez-Abrams

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

0
Basile Starynkevitch

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

0
Nagi