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");