Linux - статьи

Hello World (часть 2)


Как мы уже упоминали, начиная с ядра, версии 2.3.13, требования к именованию начальной и конечной функций модуля были сняты. Достигается это с помощью макроопределений module_init() и module_exit(). Они определены в файле linux/init.h. Единственное замечание: начальная и конечная функции должны быть определены выше строк, в которых вызываются эти макросы, в противном случае вы получите ошибку времени компиляции. Ниже приводится пример использования этих макроопределений:

Пример 2-3. hello-2.c

/* * hello-2.c - Демонстрация использования * макроопределений module_init() и module_exit(). */ #include <linux/module.h> /* Необходим для любого модуля ядра */ #include <linux/kernel.h> /* Здесь находится определение KERN_ALERT */ #include <linux/init.h> /* Здесь находятся определения макросов */

static int __init hello_2_init(void) { printk(KERN_ALERT "Hello, world 2\n"); return 0; }

static void __exit hello_2_exit(void) { printk(KERN_ALERT "Goodbye, world 2\n"); }

module_init(hello_2_init); module_exit(hello_2_exit);

Теперь мы имеем в своем багаже два настоящих модуля ядра. Добавить сборку второго модуля очень просто:

Пример 2-4. Makefile для сборки обоих модулей

obj-m += hello-1.o obj-m += hello-2.o

Теперь загляните в файл linux/drivers/char/Makefile. Он может рассматриваться как пример полноценного Makefile модуля ядра. Здесь видно, что ряд модулей жестко "зашиты" в ядро (obj-y), но нигде нет строки obj-m. Почему? Знакомые с языком сценариев командной оболочки легко найдут ответ. Все записи вида obj-$(CONFIG_FOO) будут заменены на obj-y или obj-m, в зависимости от значения переменных CONFIG_FOO. Эти переменные вы сможете найти в файле .config, который был создан во время конфигурирования ядра с помощью make menuconfig или что-то вроде этого.



Содержание раздела