Хотя драйвер более или менее остается прежним (в обоих случаях), использование «драйверов», встроенных в монолитное ядро, определенно дает преимущества.
Я попытаюсь объяснить "усилия по переносу" той части драйвера, которую вы просили.
В зависимости от типа вашего драйвера, по сути, вы должны выяснить, как он будет вписываться в текущее дерево исходных текстов ядра, его компиляцию (включите ваш .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