5.6.1 Интерфейсы модуля

Предыдущая  Содержание  Следующая V*D*V

Пример модуля ядра для версии 2.4 и 2.6 показан в Распечатке 5.9. Модуль выводит строку Hello world каждый раз, когда он загружается и Bye world каждый раз, когда он выгружается. Сколько раз распечатается первая строка зависит от параметра модуля, определённого здесь как excount.

Некоторые моменты, которые следует отметить:

 

Функции входа и выхода: модуль должен иметь функции входа и выхода, которые автоматически вызываются ядром, когда модуль загружается и выгружается, соответственно. В ядре версии 2.4, функциями входа и выхода являются функции init_module() и cleanup_module(). Однако, в ядре версии 2.6 они регистрируются специальным образом с помощью  макросов module_init() и module_exit().

Передача параметров: каждому модулю могут быть переданы параметры; они передаются в качестве аргументов командной строки при загрузке модуля. В ядре версии 2.4 для предоставления аргументов модулю используется макрос MODULE_PARM. В ядре версии 2.6 параметры объявляются с макросом module_param() (* MODULE_PARAM в ядре версии 2.6 является устаревшим.), как показано в Распечатке 5.9.

Поддержка счётчика использования модуля: каждый модуль имеет счётчик использования, который показывает число ссылок на этот модуль. Значение счётчика ссылок 0 означает, что модуль может быть выгружен безопасно. В ядре версии 2.4 счётчик модуля хранился каждым модулем. Этот подход имел дефект при работе кода выгрузки модуля на системах с симметричной многопроцессорной обработкой. Поэтому в системах версии 2.6 модуль не должен поддерживать счётчик использования, вместо этого его поддерживает ядро. Однако, это приводит к проблеме, если происходит обращение к функции модуля после выгрузки модуля. Если вы делаете вызов через указатель на функцию в другом модуле, вы должны иметь ссылку на этот модуль. В противном случае, вы рискуете заснуть в модуле, если он выгружен. Для решения этой проблемы ядро предоставляет интерфейсы для доступа к модулю; ссылку на модуль можно получить при помощи интерфейса try_module_get() и освободить ссылку на него с помощью интерфейса module_put().

Объявление лицензии: каждый модуль должен объявить, является ли он чьей-то собственностью или же непатентованным модулем. Это делается с помощью макроса MODULE_LICENSE. Если аргументом является GPL, это означает, что он будет выпущен под лицензией GPL.

 

Предыдущая  Содержание  Следующая