Модули ядра Linux

Я не понимаю, в чем разница между драйверами, которые могут быть «встроены» в монолитное ядро, и драйверами, доступными только как внешние модули.

Какие усилия требуются для «переноса» какого-либо драйвера (предоставляемого только как «внешний модуль») на монолитное ядро?

Я хотел бы иметь возможность запускать Vmware Tools, отключив поддержку загружаемых модулей и избавившись от initrd bazaar.


person klo    schedule 01.12.2013    source источник
comment
то, что обычно называют модулем ядра, в частности, является модулем DKMS en.wikipedia.org/wiki/Dynamic_Kernel_Module_Support (по крайней мере, в 99,9% случаев). Но в любом случае вам все равно понадобится исходный код и поддержка той ветви ядра Linux, которую вы планируете использовать на своей машине.   -  person user2485710    schedule 01.12.2013
comment
В порядке. Но какие усилия нужны для преобразования исходного кода? Ядро Linux предоставляет огромное количество кода, который может быть скомпилирован как модуль DKMS или встроен в монолитное ядро. Я предполагаю, что есть какой-то общий код и какой-то код, специфичный для модуля, или настройки make-файла, или что-то еще. Я не очень этим занимаюсь, поэтому хотел бы понять, в чем дело.   -  person klo    schedule 01.12.2013
comment
Почему вы хотите использовать монолитное ядро? Это может помочь ответить на ваш вопрос.   -  person Peter    schedule 02.12.2013
comment
Безопасность, производительность, простая конфигурация, компактность, быстрая загрузка. Никакой гибкости не требуется.   -  person klo    schedule 03.12.2013


Ответы (1)


Хотя драйвер более или менее остается прежним (в обоих случаях), использование «драйверов», встроенных в монолитное ядро, определенно дает преимущества.

Я попытаюсь объяснить "усилия по переносу" той части драйвера, которую вы просили.

В зависимости от типа вашего драйвера, по сути, вы должны выяснить, как он будет вписываться в текущее дерево исходных текстов ядра, его компиляцию (включите ваш .ko в uImage) и загрузку во время загрузки ядра. Проиллюстрируем немного каждый шаг:

а.) Найдите папку (в дереве исходных кодов ядра), в которой, по вашему мнению, лучше всего хранить код вашего драйвера.

б.) Работайте, чтобы убедиться, что код вашего драйвера компилируется. [т.е. в конечном итоге он будет частью монолитного образа ядра (uImage или как вы его называете)]. В этом контексте вам нужно поработать над файлом Makefile для вашего драйвера. Возможно, вам придется ввести некоторые флаги CONFIG для компиляции кода вашего драйвера. В дереве исходных текстов лежат тонны Makefiles и кода драйверов. Бродите вокруг, и вы получите хорошее представление о том, как это делается.

c.) Убедитесь, что код вашего драйвера не зависит от любого другого загружаемого модуля ядра (т. е. таких модулей, которые не являются частью «монолитного» образа ядра). Потому что, если вы вызываете код своего драйвера (который сейчас является монолитным и находится в памяти), который зависит от кода загружаемого модуля, это может вызвать некоторую ошибку типа паники / сегментации ядра.

d.) Убедитесь, что ваш драйвер зарегистрирован в подсистеме более высокого уровня, которая будет инициализировать все зарегистрированные драйверы во время загрузки. (например: драйвер i2c, однажды зарегистрированный в инфраструктуре драйверов i2c, будет загружен автоматически, когда подсистема i2c инициализируется при запуске системы). Этот шаг может не потребоваться, если вы можете найти другой способ вызова функций __init и __exit вашего драйвера.

e.) Теперь ваши разделы Driver _ init и ( _exit) «должны» вызываться, если он загружается какой-либо структурой драйвера устройства или напрямую (то есть во время загрузки ядра).

е.) В случае драйверов h / w у нас есть реализация .probe в драйвере, которая будет вызываться, как только ядро ​​найдет соответствующее устройство. В случае драйверов ПО, я думаю, __init и __exit - это все, что у вас есть.

g.) После загрузки вы можете использовать его, как раньше, в качестве загружаемого модуля ядра.

з.) Я рекомендую прочитать исходный код аналогичных драйверов устройств в дереве ядра Linux и посмотреть, как они работают.

Надеюсь это поможет.

person dkumar    schedule 04.12.2013