Драйвер “Hello world”: загрузка и удаление драйвера в пространстве ядра

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

Когда модуль драйвера устройства загружается в ядро, обычно выполняются некоторые предварительные задачи, такие как сброс устройства, резервирование памяти, резервирование прерываний, резервирование портов ввода/вывода и так далее.

 

В пространстве ядра эти задачи выполняются двумя функциями, которые должны присутствовать (и быть явно объявленными): module_init и module_exit; они соответствуют командам пользовательского пространства insmod и rmmod, которые используются при установке или удалении модуля. Таким образом, пользовательские команды insmod и rmmod используют функции пространства ядра module_init и module_exit.

 

Давайте посмотрим практический пример с классической программой Hello World:

 

<hello.c> =

 

#include <linux/init.h>

#include <linux/module.h>

#include <linux/kernel.h>

 

MODULE_LICENSE("Dual BSD/GPL");

 

static int hello_init(void) {

    printk("<1> Hello world!\n");

    return 0;

}

 

static void hello_exit(void) {

    printk("<1> Bye, cruel world\n");

}

 

module_init(hello_init);

module_exit(hello_exit);

 

Фактическим функции hello_init и hello_exit можно дать любое желаемое имя. Однако, чтобы они идентифицировались как соответствующие функциям загрузки и удаления, они должны быть переданы в качестве параметров в функции module_init и module_exit.

 

Представлена также функция printk. Она очень похожа на хорошо известную printf помимо того факта, что она работает только внутри ядра. Символ <1> показывает высокий приоритет сообщения (малое число). Таким образом, помимо получения сообщения в файлах системного журнала ядра, вы также должны получать это сообщение в системной консоли.

 

После добавления его имени в Makefile, этот модуль может быть собран с использованием той же команды, как и прежде.

 

<Makefile2> =

 

obj-m := nothing.o hello.o

 

В остальной части этой статьи я оставил Makefiles в качестве упражнения для читателя. Полный Makefile, который будет компилировать все модули данного учебника приводится в Приложении А.

 

Когда модуль загружается или удаляется, сообщения, которые были написаны в операторе printk, будут показаны в системной консоли. Если эти сообщения на консоли не появляются, вы можете просмотреть их командой dmesg или просматривая файл системного журнала с помощью cat /var/log/syslog.

 

Таблица 4 показывает эти две функции.

 

События

Пользовательские функции

Функции ядра

Загрузка модуля

insmod

module_init()

Открытие устройства

 

 

Чтение устройства

 

 

Запись в устройство

 

 

Закрытие устройства

 

 

Удаление модуля

rmmod

module_exit()

 

Таблица 4. События драйвера устройства и связанные с ними интерфейсные функции в пространстве ядра и пользовательском пространстве.

 

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