Драйвер “Hello world”: загрузка и удаление драйвера в пространстве ядра |
Предыдущая Содержание Следующая |
Когда модуль драйвера устройства загружается в ядро, обычно выполняются некоторые предварительные задачи, такие как сброс устройства, резервирование памяти, резервирование прерываний, резервирование портов ввода/вывода и так далее.
В пространстве ядра эти задачи выполняются двумя функциями, которые должны присутствовать (и быть явно объявленными): 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 показывает эти две функции.
Таблица 4. События драйвера устройства и связанные с ними интерфейсные функции в пространстве ядра и пользовательском пространстве.
| |||||||||||||||||||||
Предыдущая Содержание Следующая |