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

20

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

    
задан Dien Nguyen 25.07.2012 в 05:37
источник

4 ответа

31

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

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

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

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

    
ответ дан Yasushi Shoji 25.07.2012 в 10:34
  • Спасибо @ Yasushi Shoji за подробные объяснения! –  Dien Nguyen 26.07.2012 в 08:49
  • Это пример отличного ответа! –  VividD 20.08.2014 в 10:39
2

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

    
ответ дан Ignacio Vazquez-Abrams 25.07.2012 в 08:42
0

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

    
ответ дан Basile Starynkevitch 25.07.2012 в 07:55
0

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

    
ответ дан Nagi 25.08.2014 в 08:05