Linux - статьи


Hello World (часть 4): Вопросы лицензирования и документирования модулей


Если у вас установлено ядро 2.4 или более позднее, то наверняка, во время запуска примеров модулей, вам пришлось столкнуться с сообщениями вида:

# insmod hello-3.o Warning: loading hello-3.o will taint the kernel: no license See http://www.tux.org/lkml/#export-tainted for information about tainted modules Hello, world 3 Module hello-3 loaded, with warnings

В ядра версии 2.4 и выше был добавлен механизм контроля лицензий, чтобы иметь возможность предупреждать пользователя об использовании проприетарного (не свободного) кода. Задать условия лицензирования модуля можно с помощью макроопределения MODULE_LICENSE(). Ниже приводится выдержка из файла linux/module.h

(от переводчика: я взял на себя смелость перевести текст комментариев на русский язык):

/* * В настоящее время, для обозначения свободных лицензий, приняты следующие * идентификаторы * * "GPL" [GNU Public License v2 или выше] * "GPL v2" [GNU Public License v2] * "GPL and additional rights" [GNU Public License v2 с дополнительными правами] * "Dual BSD/GPL" [GNU Public License v2 * или BSD license] * "Dual MPL/GPL" [GNU Public License v2 * или Mozilla license] * * Кроме того, дополнительно имеются следующие идентификаторы * * "Proprietary" [проприетарный, не свободный продукт] * * Здесь присутствуют компоненты, подразумевающие двойное лицензирование, * однако, по отношению к Linux они приобретают значение GPL, как наиболее * уместное, так что это не является проблемой. * Подобно тому, как LGPL связана с GPL * * На это есть несколько причин * 1. modinfo может показать сведения о лицензировании * для тех пользователей, которые желают, чтобы их * набор программных компонент был свободным * 2. Сообщество может игнорировать отчеты об ошибках * (bug reports), относящиеся к проприетарным модулям * 3. Поставщики программных продуктов могут поступать * аналогичным образом, основываясь на своих * собственных правилах */

Точно так же, для описания модуля может использоваться макрос MODULE_DESCRIPTION(), для установления авторства -- MODULE_AUTHOR(), а для описания типов устройств, поддерживаемых модулем -- MODULE_SUPPORTED_DEVICE().


Все эти макроопределения описаны в файле linux/module.h. Они не используются ядром и служат лишь для описания модуля, которое может быть просмотрено с помощью objdump. Попробуйте с помощью утилиты grep

посмотреть, как авторы модулей используют эти макросы (в каталоге linux/drivers).

Пример 2-6. hello-4.c

/* * hello-4.c - Демонстрация описания модуля. */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #define DRIVER_AUTHOR "Peter Jay Salzman <p@dirac.org>" #define DRIVER_DESC "A sample driver"

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

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

module_init(init_hello_4); module_exit(cleanup_hello_4);

/* * Вы можете передавать в макросы строки, как это показано ниже: */

/* * Запретить вывод предупреждения о "загрязнении" ядра, * объявив код под GPL. */ MODULE_LICENSE("GPL");

/* * или определения: */ MODULE_AUTHOR(DRIVER_AUTHOR); /* Автор модуля */ MODULE_DESCRIPTION(DRIVER_DESC); /* Назначение модуля */

/* * Этот модуль использует устройство /dev/testdevice. * В будущих версиях ядра * макрос MODULE_SUPPORTED_DEVICE может быть использован * для автоматической настройки модуля, но пока * он служит исключительно в описательных целях. */ MODULE_SUPPORTED_DEVICE("testdevice");


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