Модуль ядра может вообще не быть драйвером устройства.
«Драйвер ядра» - не очень четко обозначенный термин, но давайте попробуем.
Это модуль ядра, который не управляет каким-либо оборудованием, и, следовательно, не может рассматриваться как «драйвер устройства»:
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int myinit(void)
{
printk(KERN_INFO "hello init\n");
return 0;
}
static void myexit(void)
{
printk(KERN_INFO "hello exit\n");
}
module_init(myinit)
module_exit(myexit)
После сборки вы можете использовать его с:
insmod hello.ko
и это печатает hello init
на dmesg
.
Однако существуют модули ядра, которые не являются драйверами устройств, но на самом деле полезны, например, модули, которые предоставляют информацию об отладке / производительности ядра.
Драйверы устройств обычно также являются модулями ядра.
Пример чего-то, что является «драйвером устройства», генерировать немного сложнее, поскольку для его работы требуется аппаратное обеспечение, а описания аппаратного обеспечения, как правило, сложны.
Однако используя QEMU или другие эмуляторы, мы можем создавать программные модели из реального или упрощенного аппаратного обеспечения, что является отличным способом научиться общаться с аппаратным обеспечением. Вот простой пример минимального драйвера устройства PCI: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
Затем мы видим, что в x86 общение с оборудованием сводится к:
Эти операции, как правило, не могут быть выполнены из пользовательского пространства , как объяснено в разделе: В чем разница между пространством пользователя и пространством ядра? Однако есть некоторые исключения: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .
Затем ядро предлагает API более высокого уровня, чтобы сделать такое аппаратное взаимодействие более простым и переносимым:
request_irq
обрабатывать прерывания
ioreadX
и отображение памяти ввода-вывода
- интерфейсы еще более высокого уровня для популярных протоколов, таких как PCI и USB