The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

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

Драйвер “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. События драйвера устройства и связанные с ними интерфейсные функции в пространстве ядра и пользовательском пространстве.

 

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