Вопрос или проблема
Я работал с платой с встроенным процессором ARM. Чтобы она загрузилась, мне нужно добавить загрузчик, ядро Linux и образ диска, содержащий файловую систему корня. Этот образ диска доступен в интернете для целевой платы (ZedBoard).
После компиляции ядра с активированными всеми необходимыми драйверами, я обнаружил, что многие драйверы находятся в папке /lib/modules/kernel_version
.
Я немного запутался, как это все работает. Драйверы загружаются ядром? Если да, то почему они уже являются частью rootfs? Или ядро переписывает их на те, что скомпилированы в нем?
Это довольно просто, хотя мы должны различать “драйвер” и “модуль”. Драйвер может быть модулем или не быть им. Если он не является модулем, то он встроен в ядро, загружаемое загрузчиком.
Если это модуль, то он находится в иерархии файловой системы, коренящейся в /lib/modules/[kernel-release]
.1 Обратите внимание, что возможно загрузить ядро вместе с небольшой предварительной файловой системой корня (аналог “initramfs”), которая также может содержать такой репозиторий. Это нормально для универсальных ядер, так как они могут определить, какие модульные драйверы необходимо загрузить для доступа к реальной файловой системе, так как если они не могут этого сделать, они не могут получить доступ к модулям там.
Драйверы загружаются ядром?
Да.
Если да, то почему они уже являются частью rootfs?
Где еще они должны храниться до загрузки? Ядро не содержит rootfs внутри себя (за исключением некоторых форм initramfs), оно просто является стражем ворот.
Ядро переписывает их на те, что скомпилированы в нем?
Нет. Если вы компилируете драйвер, ядро не будет беспокоиться о проверке /lib/modules
. Я не уверен, что произойдет, если вы затем попросите его явно загрузить такой драйвер, предположительно, оно просто скажет нет.
1. Как намекает Celada с помощью $(uname -r)
, эта строка выпуска не обязательно является только номером версии. У вас могут быть несколько ядер с одинаковой версией и разными строками выпуска, следовательно, отдельные хранилища модулей. Аналогично, могут быть несколько ядер с одинаковой строкой выпуска, следовательно, одно и то же хранилище модулей.
В Linux большинство драйверов могут быть либо встроены статически в ядро, либо собраны в виде модулей. Это выбор, который вы можете сделать при конфигурации ядра для компиляции. Они будут появляться только в /lib/modules/$(uname -r)
, если они собраны в виде загружаемых модулей.
Как правило, для систем общего назначения, особенно для предкомпилированных ядер, предоставляемых в составе дистрибутивов Linux, строгое минимальное количество драйверов будет встроено статически, а как можно больше будет собрано в качестве модулей. Это позволяет системе каждого пользователя загружать только необходимые модули, не зная заранее, что это за модули.
Ядра для встроенных систем часто собираются с гораздо большим количеством встроенных драйверов, потому что ядро создается для системы с очень определенным набором неизменяемого аппаратного обеспечения, и системный интегратор заранее знает, что это за оборудование. Тем не менее, многие драйверы часто остаются для загрузки в виде модулей, особенно для “добавочного” оборудования, которое может присутствовать или отсутствовать, как USB-устройства.
Ответ или решение
Являются ли драйверы Linux частью ядра или корневой файловой системы (rootfs)?
Работа с драйверами в Linux может вызывать путаницу, особенно когда речь идет о том, как они интегрируются в систему и в какую часть файловой структуры они входят. Давайте разберемся в этом вопросе, применяя структуру FOREST: Факты, Объяснение, Примеры, Результаты, Советы.
Факты
Драйверы в Linux могут быть встроены статически в ядро или собраны в виде модулей. Если они встраиваются в ядро, они загружаются при его инициализации. Если же они включены как модули, они размещаются в каталоге /lib/modules/$(uname -r)
и могут загружаться динамически.
- Статические драйверы: Драйверы, скомпилированные вместе с ядром, загружаются автоматически при старте системы.
- Модули: Загружаются по мере необходимости из файловой системы, и могут быть добавлены или удалены без перезагрузки.
Объяснение
Ответ на ваш вопрос о том, являются ли драйверы частью ядра или корневой файловой системы, заключается в том, что драйверы являются частью ядра, если они встроены, и частью файловой системы, если они реализованы как модули.
Когда вы компилируете ядро, у вас есть возможность выбрать, какие драйверы должны быть статически встраиваемыми, а какие — загружаемыми модулями. Если драйвер является модулем, то он должен находиться в соответствующей директории в файловой системе, чтобы при необходимости он мог быть загружен в память.
Примеры
Предположим, вы работаете с ARM-платформой, как в вашем случае с ZedBoard. После успешной компиляции ядра вы заметили, что многие драйверы уже находятся в каталоге /lib/modules/kernel_version
. Это подтверждает, что данные драйверы были скомпилированы как модули.
-
Если вы хотите использовать драйвер, который находится в
/lib/modules
, вы можете легко загрузить его с помощью командыmodprobe
. Пример:sudo modprobe <имя_драйвера>
-
Если драйвер был скомпилирован в ядро, он загрузится автоматически, и вам не нужно будет заботиться о его загрузке вручную.
Результаты
Выяснив, как работают драйверы в Linux, вы сможете лучше организовать свою среду разработки. Это важно для настройки и обслуживания системы, особенно в контексте встраиваемых решений, таких как ARM-платформы, где каждое решение может быть индивидуально адаптировано под конкретное железо.
Советы
-
Выбор драйверов: При конфигурации ядра для встраиваемых систем имейте в виду, что лучше включить как можно больше драйверов статически, чтобы избежать необходимости в динамической загрузке модулей. Это снизит время загрузки и уменьшит возможные конфликты.
-
Ознакомление с документацией: Регулярно обращайтесь к официальной документации как по ядру Linux, так и по своему конкретному оборудованию, чтобы быть в курсе изменений и улучшений.
-
Проверка совместимости: Убедитесь, что версия ядра и модули совместимы между собой. Это поможет избежать множества проблем при загрузке и работе системы.
В заключение, драйверы в Linux могут находиться как внутри ядра, так и в файловой системе, при этом их размещение значительно влияет на работу системы и управление оборудованием. Правильное понимание этой концепции — ключ к успешной разработке и внедрению решений на базе Linux.