linux-kernel
Драйвер устройства Hello Hello World
Поиск…
Пустой модуль ядра
#include <linux/init.h>
#include <linux/module.h>
/**
* This function is called when the module is first loaded.
*/
static int __init hello_kernel_init(void)
{
printk("Hello, World!\n");
return 0;
}
/**
* This function is called when is called if and when the module is unloaded.
*/
static void __exit hello_kernel_exit(void)
{
printk("Goodbye, cruel world...\n");
}
/* The names of the init/exit functions are arbitrary, and they are bound using the following macro definitions */
module_init(hello_kernel_init);
module_exit(hello_kernel_exit);
Чтобы написать драйвер устройства Linux (Character-device, Block-device и т. Д.), Необходимо создать модуль ядра, который имеет точки входа и выхода.
Сам по себе модуль ядра ничего не делает; он не имеет значимого способа общения с пользовательским пространством. Используя точку входа, можно создать, например, новое символьное устройство, которое затем используется для связи с пользовательским пространством.
Создание и запуск модуля
Чтобы скомпилировать драйвер, необходимо иметь исходное дерево ядра ядра Linux.
Предполагая, что исходные файлы находятся в /lib/modules/<kernel-version>
, следующий файл Makefile будет скомпилировать файл driver.c
в файл driver.ko
Kernel
obj-m := driver.o
KDIR := /lib/modules/$(shell uname -r)/build/
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
Обратите внимание на то, как это Makefile вызовы make
в каталог сборки ядра.
Когда этап компиляции завершится успешно, каталог src драйвера будет выглядеть примерно так:
driver.c driver.ko driver.mod.c driver.mod.o driver.o Makefile modules.order Module.symvers
Чтобы «запустить» модуль, необходимо вставить в запущенное ядро:
$ insmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Hello, World!
$ rmmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Goodbye, cruel world...