28.1. Каркас модуля

28.1. Каркас модуля

Что будет делать ваш модуль, зависит от вас — это может быть драйвер устройства или просто небольшой модуль, дополняющий ядро нужной вам функцией.

Для начала напишем каркас модуля на языке С. Этот каркас можно будет скомпилировать, но в результате получится модуль, который не делает ничего. Он просто послужит вам основой для написания настоящих, серьезных модулей.

Листинг 28.1. Каркас модуля ядра Linux (module1.с)

#define MODULE

#define __KERNEL__

#include <linux/module.h>

int init_module() {

 return 0;

}

void cleanup_module() {}

Теперь разберемся, что означает каждая строчка кода нашего будущего модуля. Первые две строчки делают обыкновенную программу модулем ядра Linux. Это директивы препроцессора cpp, обязательные для каждого модуля. Если вы не укажете их, компилятор сгенерирует совсем не тот код, которого мы от него ожидали.

Третья строка подключает заголовочный файл module.h, в котором находятся все необходимые для создания модуля определения.

Функция init_module() вызывается при загрузке модуля ядром. Если загрузка модуля прошла успешно, функция возвращает 0, в противном случае она должна возвратить любое другое значение — код ошибки.

Функция cleanup_module() вызывается при удалении модуля. Тип возвращаемого ею значения не определен, поэтому проверить, успешно ли произошло удаление, сама функция не позволяет.

Названия функций init_module() и cleanup_module() необязательны — вы можете назвать их по-другому, но для этого вам нужно использовать функции module_init() и module_exit(), которые определены в заголовочном файле init.h.

Переделаем наш шаблон так, чтобы он не использовал стандартные имена функций init_module() и cleanup_module():

Листинг 28.2. Шаблон модуля с переименованием стандартных функций (module2.c)

#define MODULE

#define __KERNEL__

#include <linux/module.h> // для модуля.

#include <linux/init.h> // module_init() и module_exit()

int start() {

 return 0;

}

void stop() {}

module_init(start);

module_exit(stop);

Функциям module_init() и module_exit() нужно передать имена функций, которые будут вызваны при инициализации и удалении модуля соответственно. Зачем это нужно? Так, для общего развития — чтобы вы знали, для чего используются эти функции. Ваш модуль не станет работать лучше, если вы переименуете стандартные функции инициализации и удаления.

Помните, для чего используется программа modinfo? Да, для получения информации о модуле. Давайте добавим эту информацию в наш модуль.

Листинг 28.3. Информация о модуле (module3.c)

#define MODULE

#define __KERNEL__

#include <linux/module.h>

MODULE_AUTHOR("Denis Kolisnichenko dhsilabs@mail.ru");

MODULE_DESCRIPTION("Linux kernel module");

int init_module() {

 return 0;

}

void cleanup_module() {

 return 0;

}

Макросы MODULE_AUTHOR и MODULE_DESCRIPTION определены в заголовочном файле module.h, поэтому никаких дополнительных заголовочных файлов подключать не нужно.

При необходимости модуль может выводить на консоль сообщения, например, о невозможности инициализации устройства. Выводимые модулем сообщения будут запротоколированы службой протоколирования ядра — демоном klogd. Выводить сообщения нужно не с помощью функции printf(), а функцией printk(). В этом случае сообщения не только окажутся на системной консоли, но и будут запротоколированы в файле /var/log/messages.

Сейчас мы напишем модуль, который будет выводить сообщения при загрузке и при удалении.

Листинг 28.4. Использование функции printk() (module.с)

#define MODULE

#define __KERNEL__

#include <linux/module.h>

#include <linux/kernel.h> // printk

MODULE_AUTHOR{"Denis Kolisnichenko dhsilabs@mail.ru");

MODULE_DESCRIPTION("Linux kernel module");

int init_module() {

 printk("My module: Starting... ");

 return 0;

}

void cleanup_module() {

 printk("My module: Stopping... ");

 return 0;

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Каркас удаленного взаимодействия .NET

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Каркас удаленного взаимодействия .NET Когда клиенты и серверы обмениваются информацией через границы приложений, среда CLR вынуждена использовать низкоуровневые примитивы, обеспечивающие настолько "прозрачное" взаимодействие сторон, насколько это возможно. Это значит,


Файл программного модуля .pas

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

Файл программного модуля .pas Файл программного модуля (формы или независимый) имеет следующую структуру:unit имя_модуля;//начало интерфейсной части модуля interfaceuses {раздел ссылок на другие программные модули, классы, типы, переменные, процедуры или функции которых


Внедрение модуля Joomla!

Из книги автора

Внедрение модуля Joomla! Внедрение модуля Joomla! проводится с помощью команд, встроенных в HTML код. Это могут быть и старые команды Joomla! 1.0.x или Mambo 4.5.x, или новые команды patTemplate. Класс patTemplate служит для дифференцирования PHP и HTML кода. Для интеграции в шаблон различных элементов, Joomla!


1.2.6. Каркас диаграммы

Из книги автора

1.2.6. Каркас диаграммы На рис. 1.28 показан типичный пример диаграммы декомпозиции с граничными рамками, которые называются каркасом диаграммы. Рис. 1.28. Пример диаграммы декомпозиции с каркасомКаркас содержит заголовок (верхняя часть рамки) и подвал (нижняя часть).


Каркас сайта

Из книги автора

Каркас сайта Создание каркаса – это простой, не требующий особых знаний графических программ процесс. Каркас широко применяется в скульптуре, на нем обычно держится вся композиция. В нашем случае он представляет собой упрощенную модель сайта, в которой присутствуют все


1.2.6. Каркас диаграммы

Из книги автора

1.2.6. Каркас диаграммы На рис. 1.2.26 показан типичный пример диаграммы декомпозиции с граничными рамками, которые называются каркасом диаграммы. Рис. 1.2.26. Пример диаграммы декомпозиции с каркасомКаркас содержит заголовок (верхняя часть рамки) и подвал (нижняя часть).


Каркас процедуры

Из книги автора

Каркас процедуры Вот два примера процедур, по одной каждого из типов (Sub и Function): Public Sub Субмарина() MsgBox Поднять перископ! End Sub Public Function ФункШин(ДатаРождения As Date) ФункШин = DateDiff (yyyy, ДатаРождения, Date) End Function Как видите, каждая из процедур имеет начинающий процедуру


28.2. Компиляция модуля

Из книги автора

28.2. Компиляция модуля Компилировать мы будем файл module.c. Для этого понадобится установленный компилятор gcc, заголовочные файлы и исходные тексты ядра. Если вы дочитали книгу до этой главы, то у вас уже должны быть установлены пакеты:1. cpp — препроцессор cpp;2. binutils — набор


Структура модуля

Из книги автора

Структура модуля Модули предназначены для разбиения текста программы на несколько файлов. В модулях описываются переменные, константы, типы, классы, процедуры и функции. Для того чтобы эти объекты можно было использовать в вызывающем модуле (которым может быть и