Недавно я установил встроенный Linux, поставляемый поставщиком, на аппаратное устройство. Когда я запустил lsmod
в командной строке устройства, ответ был пустым. Я был уверен, что это означает, что драйверы для оборудования, работающего на устройстве, были встроены в ядро, а не в файлы .ko. Мой вопрос таков: как происходит этот процесс?
Постепенно ли интегрируется поддержка ядра в последующие версии в ядро, заменяя таким образом файлы .ko? Файл .ko просто используется для поддержки нового оборудования, которое не имеет встроенной поддержки ядра на момент выпуска? Насколько я знал, я думал, что все аппаратные драйверы имеют форму файлов .ko, но, очевидно, это неправильно.
Меня слегка смущает весь процесс, и я был бы благодарен за разъяснения, так как у меня есть ощущение, что я могу смотреть на ситуацию неправильно.
При компиляции ядра вы получаете конфигурирование , какие компоненты установлены. Не только это, но вы можете выбрать, встроены они в ядро или нет, или они являются модулем .
Например, многие люди используют файловую систему ext2 в своем разделе / boot . Из-за этого ядро должно быть способно читать файловые системы ext2 во время загрузки. Для этого модуль ext2 встроен в само ядро.
Теперь представьте себе количество доступных модулей. Не имеет смысла встраивать их все в ваше ядро, не так ли? Вот почему вы можете создавать их как отдельные модули .ko и загружать их по желанию.
См. Содержимое файла / lib / modules / $ (uname -r) /modules.builtin
, например. искать определенный модуль
grep <module> /lib/modules/$(uname -r)/modules.builtin
Documentation / kbuild / kbuild.txt
modules.builtin
--------------------------------------------------
This file lists all modules that are built into the kernel. This is used
by modprobe to not fail when trying to load something builtin.
Это зависит от того, как вы настроили сборку ядра Linux.
В процессе компиляции вы обычно можете:
, чтобы понять, что такое файл .ko для https://stackoverflow.com/questions/10476990/difference-between-o-and -ko-file
Причина, по которой у вас пустой вывод на lsmod
, заключается в том, что у вас монолитное ядро.
Быстрый способ перечисления всех ваших модулей (если они присутствуют) заключается в запуске этой команды.
find /lib/modules/*/ -type f -iname '*.ko' | less
обратите внимание на использование less
, вы можете использовать любой пейджер или перенаправить выведите туда, куда хотите.
Драйверы ядра, которые считаются критическими для загрузки ядра, обычно встроены в ядро, в то время как другие драйверы оборудования и т. Д. Создаются в виде модулей или файлов .ko .
Модули .ko обычно хранятся в каталоге /lib
вашего корневого раздела. Чтобы использовать любой из них, ядро должно сначала иметь возможность обнаружить и получить доступ к базовому устройству хранения, а затем получить доступ к его файловой системе. Поэтому можно с уверенностью предположить, что ядро без встроенной поддержки SATA / SCSI и поддержки ext2 / 3/4 в действительности не загрузится;)
Вы можете переключить большинство встроенных драйверов ядра в форму модуля , Команда ядра Ubuntu решает, следует ли изменить конфигурацию по умолчанию команды ядра Linux и включить / исключить дополнительные встроенные драйверы для загружаемых стандартных образов ядра.
Если вы собираете свое собственное ядро, вы можете сделать то же самое:
*
указывает встроенную в драйвере, а M
обозначает модуль. ls /sys/module
, кажется, содержит все встроенные и внешние модули.
Но он также содержит некоторые записи, которые на самом деле не являются модулями: https://unix.stackexchange.com/questions/225706/are-modules-listed-under-sys-module-all-the- Загруженные модули
TODO: прочитайте исходный код и более точно поймите, что там находится.
Преимущество этого метода в том, что вы не можете найти конфигурацию ядра в /boot
или /proc/config.gz
.