Збірка модулів

Завдяки новій системі збірки kbuild, в ядрах серії 26 збірка модулів виконується значно простіше, ніж у старих серіях Перше, що потрібно зробити при складанні модулів, – це вирішити, де перебуватиме вихідний код модуля Вихідний код модуля необхідно правильно обєднати з деревом вихідних кодів ядра Це можна зробити у вигляді латки або шляхом додавання в офіційне дерево вихідного коду ядра Крім цього, можна компілювати вихідний код модуля окремо від вихідних кодів ядра

Використання дерева каталогів вихідних кодів ядра

В ідеалі модуль є частиною офіційного ядра і знаходиться в каталозі вихідних кодів ядра Введення вашої розробки безпосередньо в ядро ​​може спочатку зажадати більше роботи, але зазвичай таке рішення більш переважно

На першому етапі необхідно вирішити,де саме перебуватиме модуль в дереві вихідних кодів ядра Драйвери необхідно зберігати в підкаталогах каталогу drivers /, який знаходиться в корені дерева вихідних кодів ядра Усередині цього каталогу драйвери діляться на класи, типи і власне на окремі драйвери Символьні пристрої знаходяться в каталозі drivers / char /, блокові-в каталозі drivers / block /, пристрої USB – в каталозі drivers / usb / Ці правила не є жорсткими, так як багато пристроїв USB також є і символьними пристроями Але така організація є зрозумілою і чіткою

Припустимо, що ви хочете створити свій підкаталог і ваш уявний драйвер розроблений для вудки з числовим програмним управлінням, яка має інтерфейс Fish Master XL 2000 Titanium для підключення до компютера Отже, необхідно створити підкаталог fishin g всередині каталогу drivers / char /

Після цього необхідно додати новий рядок у файл Makefile, який знаходиться в каталозі drivers / char / Для цього відредагуйте файл drivers / char / Makefil e і додайте в нього наступний запис

obj-m += fishing/

Цей рядок вказує системі компіляції, що необхідно увійти в підкаталог fishing / при компіляції модулів Швидше за все, компіляція драйвера визначається окремим конфігураційним параметром, наприклад, CONFIG_FISHING_POLE (як створювати нові конфігураційні параметри, розглянуто нижче в цьому розділі в підрозділі Управління конфігураційними параметрами) У цьому випадку необхідно додати рядок наступного виду

obj-$(CONFIG_FISHING_POLE) += fishing/

І нарешті, в каталозі drivers / char / fishin g необхідно додати новий файл

Makefile, що містить наступний рядок

obj-m + = fishingо

При таких налаштуваннях система компіляції перейде в каталог fishing / і скомпілює модуль fishingк про з вихідного файлу fishingс Так, розширення обєктного файлу вказано як Про, але в результаті буде створений модуль з розширенням

. Ко

І знову, швидше за все, факт компіляції модуля буде залежати від конфігураційного параметра, в такому випадку в Makefil e необхідно додати наступний рядок

obj-$ (CONFIG_FISHING_POLE) + = fishingо

Одного разу драйвер вудки може стати дуже складним Введення функції автодетектірованія наявності волосіні може призвести до того, що модуль стане дуже великим і тепер буде займати більше одного файлу вихідного коду Ніяких проблем Просто потрібно внести в Makefile наступний запис

obj-$ (CONFIG_FISHING_POLE) + = fishingо fishing-objs: = fishing-mainо fishing-lineо

В останньому випадку будуть скомпільовані файли fishing-main с і fishing-line с і скомпоновані в файл модуля fishingко

Нарешті, може знадобитися передати компілятору gcc додаткові конфігураційні параметри Для цього у файлі Makefile необхідно додати наступний рядок

EXTRA_CFLAGS += -DTITANIUM_POLE

Якщо ви бажаєте помістити ваші файли в каталог drivers / char /, замість того щоб створювати новий підкаталог, то необхідно просто прописати зазначені рядки (тс, що повинні бути прописані в файлі Makefil e підкаталогу drivers / char / fishing /) у файлі drivers / char / Makefile

Для компіляції просто запустіть процес складання ядра, як звичайно Якщо компіляція модуля залежить від конфігураційного параметра, як в даному випадку вона залежить від параметра CONFIG_FISHING_POLE, то необхідно включити цей конфігураційний параметр перед компіляцією

Компіляція поза дерева вихідних кодів ядра

Якщо ви віддаєте перевагу розробляти і підтримувати ваш модуль окремо від дерева вихідних кодів ядра і жити життям аутсайдера, просто створіть файл Makefile наступного виду в тому каталозі, де знаходиться модуль

obj-m: = fishingо

Така конфігурація дозволяє скомпілювати файл fishing с в файл fishing ко Якщо ваш вихідний код займає кілька файлів, то необхідно додати два рядки

obj-m: = fishingо

fishing-objs: = fishing-mainо fishing-lineо

Така конфігурація дозволяє скомпілювати файли fishing-main с і fishing-line с і створити модуль fishing, ко

Головна відмінність від випадку, коли модуль знаходиться всередині дерева вихідного коду, полягає в процесі складання Так як модуль знаходиться за межами дерева вихідних кодів ядра, необхідно вказати утиліті make місцезнаходження вихідних файлів ядра і файл Makefil e ядра Це також робиться просто за допомогою наступної команди

make-С / kerncl / source / location SUBDTRS = $ PWD modules

У цьому прикладі / kernel / source / locatio n – шлях до сконфігурованої дереву вихідних кодів ядра Згадайте, щоне потрібно зберігати копію дерева вихідних кодів ядра, з якою ви працюєте, в каталозі / usr / src / linux, ця копія повинна бути десь в іншому місці, скажімо десь у вашому домашньому каталозі

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*