Хотя драйвер более или менее остается прежним (в обоих случаях), есть определенные преимущества для использования «драйверов», встроенных в монолитное ядро.
Я попытаюсь объяснить «усилия в портировании» часть драйвера, который вы просили.
В зависимости от типа драйвера, который у вас есть, вы, по сути, должны выяснить, как он будет вписываться в текущее исходное дерево ядра, его компиляцию (включая ваш .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 и посмотреть, как они работают.
Надеюсь, это поможет.
В общем, как правило, модуль ядра является, скорее, DKMS-модулем http://en.wikipedia.org/wiki/Dynamic_Kernel_Module_Support (не менее 99,9% времени). Но в любом случае вам по-прежнему нужен исходный код и поддержка ветки ядра Linux, которую вы планируете использовать на своей машине. – user2485710
Хорошо. Но какие усилия необходимы для «преобразования» исходного кода? Ядро Linux предоставляет огромное количество кода, который может быть скомпилирован как как модуль DKMS, так и встроен в монолитное ядро. Я предполагаю, что есть какой-то «общий код» и какой-то «специфичный для модуля» код или настройки makefile или что еще. Я не очень вникаю в это, поэтому я хотел бы понять, что происходит. – klo
Почему вы хотите использовать монолитное ядро? Это может помочь ответить на ваш вопрос. – Peter