Книга: Разработка ядра Linux
Использование дерева каталогов исходных кодов ядра
Использование дерева каталогов исходных кодов ядра
В идеале модуль является частью официального ядра и находится в каталоге исходных кодов ядра. Введение вашей разработки непосредственно в ядро может вначале потребовать больше работы, но обычно такое решение более предпочтительно.
На первом этапе необходимо решить, где именно будет находиться модуль в дереве исходных кодов ядра. Драйверы необходимо хранить в подкаталогах каталога drivers/
, который находится в корне дерева исходных кодов ядра. Внутри этого каталога драйверы делятся на классы, типы и собственно на отдельные драйверы. Символьные устройства находятся в каталоге drivers/char/
, блочные — в каталоге drivers/block/
, устройства USB — в каталоге drivers/usb/
. Эти правила не есть жесткими, так как многие устройства USB также являются и символьными устройствами. Но такая организация является понятной и четкой.
Допустим, что вы хотите создать свой подкаталог и ваш воображаемый драйвер разработан для удочки с числовым программным управлением, которая имеет интерфейс Fish Master XL 2000 Titanium для подключения к компьютеру. Следовательно, необходимо создать подкаталог fishing
внутри каталога drivers/char/
.
После этого необходимо добавить новую строку в файл Makefile
, который находится в каталоге drivers/char/
. Для этого отредактируйте файл drivers/char/Makefile
и добавьте в него следующую запись.
obj-m += fishing/
Эта строка указывает системе компиляции, что необходимо войти в подкаталог fishing/
при компиляции модулей. Скорее всего, компиляция драйвера определяется отдельным конфигурационным параметром, например, CONFIG_FISHING_POLE
(как создавать новые конфигурационные параметры, рассмотрено ниже в этой главе в разделе "Управление конфигурационными параметрами"). В этом случае необходимо добавить строку следующего вида.
obj-$(CONFIG_FISHING_POLE) += fishing/
И наконец, в каталоге drivers/char/fishing
необходимо добавить новый файл Makefile, содержащий следующую строку.
obj-m += fishing.o
При таких настройках система компиляции перейдет в каталог fishing/
и скомпилирует модуль fishing.ko
из исходного файла fishing.c
. Да, расширение объектного файла указано как .o
, но в результате будет создан модуль с расширением .ko
.
И снова, скорее всего, факт компиляции модуля будет зависеть от конфигурационного параметра, в таком случае в Makefile
необходимо добавить следующую строку.
obj-$(CONFIG_FISHING_POLE) += fishing.o
Однажды драйвер удочки может стать очень сложным. Введение функции автодетектирования наличия лески может привести к тому, что модуль станет очень большим и теперь будет занимать больше одного файла исходного кода. Никаких проблем! Просто нужно внести в Makefile
следующую запись.
obj-$(CONFIG_FISHING_POLE) += fishing.o
fishing-objs := fishing-main.o fishing-line.o
В последнем случае будут скомпилированы файлы fishing-main.c
и fishing-line.c
и скомпонованы в файл модуля fishing.ko
.
Наконец, может потребоваться передать компилятору gcc дополнительные конфигурационные параметры. Для этого в файле Makefile
необходимо добавить следующую строку.
EXTRA_CFLAGS += -DTITANIUM_POLE
Если вы желаете поместить ваши файлы в каталог drivers/char/
, вместо того чтобы создавать новый подкаталог, то необходимо просто прописать указанные строки (те, что должны быть прописаны в файле Makefile
подкаталога drivers/char/fishing/
) в файле drivers/char/Makefile
.
Для компиляции просто запустите процесс сборки ядра, как обычно. Если компиляция модуля зависит от конфигурационного параметра, как в данном случае она зависит от параметра CONFIG_FISHING_POLE
, то необходимо включить этот конфигурационный параметр перед компиляцией.
- Восстановление с использованием инструмента gbak
- Заполнение справочников и каталогов
- Типы страниц и их использование
- Использование констант
- Дополнительные национальные кодовые страницы и порядки сортировки
- Использование переменной окружения ISC_PATH
- Использование сервера Yaffil внутри процесса
- Использование CAST() с типами дата
- Использование типов содержимого и столбцов
- Обход дерева
- Вызов хранимых процедур InterBase с использованием стандартного синтаксиса ODBC
- Использование кнопки Автосумма