2013-12-01 3 views
0

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

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

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

+0

В общем, как правило, модуль ядра является, скорее, DKMS-модулем http://en.wikipedia.org/wiki/Dynamic_Kernel_Module_Support (не менее 99,9% времени). Но в любом случае вам по-прежнему нужен исходный код и поддержка ветки ядра Linux, которую вы планируете использовать на своей машине. – user2485710

+0

Хорошо. Но какие усилия необходимы для «преобразования» исходного кода? Ядро Linux предоставляет огромное количество кода, который может быть скомпилирован как как модуль DKMS, так и встроен в монолитное ядро. Я предполагаю, что есть какой-то «общий код» и какой-то «специфичный для модуля» код или настройки makefile или что еще. Я не очень вникаю в это, поэтому я хотел бы понять, что происходит. – klo

+0

Почему вы хотите использовать монолитное ядро? Это может помочь ответить на ваш вопрос. – Peter

ответ

0

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

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

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

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

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

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

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

е.) Теперь, Ваш водитель _ инициализации и ( разделы _Exit) «должны» назвать , если он становится загружен какой-либо структуры драйверов устройств или непосредственно (то есть. В то время как ядро ​​загружается).

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

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

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

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

Смежные вопросы