Главная » Ядро Linux » Сборка модулей

0

Благодаря новой  системе сборки  "kbuild", в  ядрах  серии   2.6  сборка модулей   выполняется значительно проще, чем  в старых  сериях.  Первое, что  нужно  сделать  при сборке модулей, — это  решить, где будет находиться исходный код  модуля.  Исходный код  модуля  необходимо правильно объединить с  деревом   исходных кодов  ядра.  Это можно сделать  в виде  заплаты или  путем  добавления в официальное дерево  исходного кода  ядра.  Кроме этого, можно компилировать исходный код  модуля  отдельно от исходных кодов  ядра.

Использование дерева  каталогов исходных кодов ядра

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

На  первом этапе  необходимо решить,  где именно будет  находиться модуль  в дереве  исходных кодов  ядра.   Драйверы  необходимо  хранить в  подкаталогах каталога 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 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии