Модуль ядра так модуль ядра, нет ничего проще
Я не буду углубляться в то, чтобы описывать что такое модуль и как он попадает в ядро, а сразу приступлю к делу.
И так для нашего будущего модуля понадобятся два файла, Makefile и файл с исходным кодом. Допустим файл с исходным кодом мы обзавем hellomod.c, а его содержимое будет:
#include
#include
#include
MODULE_LICENSE("GPL");
static int __init hello_in(void)
{
printk("KERN_ALERT Hello, World! From the KERNEL space...\n");
return 0;
}
static void __exit hello_out(void)
{
printk("KERN_ALERT Goodbye, World! Leaving KERNEL space...\n");
}
module_init(hello_in);
module_exit(hello_out);
думаю про подгружаемые заголовочные файлы и оформление функций говорить будет излишне, поэтому обращу лишь ваше внимание на уровни приоритета механизма регистрации событий и предупреждений, который дает нам printk().
этих уровней у нас 8:
0 - KERN_EMERG //system is unusable
1 - KERN_ALERT //action must be taken immediately
2 - KERN_CRIT //critical conditions
3 - KERN_ERR //error conditions
4 - KERN_WARNING //warning conditions
5 - KERN_NOTICE //normal
6 - KERN_INFO //informational
7 - KERN_DEBUG //debug
Дальше нам нужно описать Makefile для нашего файла с исходным кодом, выглядеть он будет так:
вот и все, все что нам осталось это скомпилировать наш исходный код в модуль ядра, следующей коммандой:
make -C /usr/src/linux-`uname -r` SUBDIRS=$PWD modules
После чего мы должны увидеть нечто вроде:
make: Entering directory `/usr/src/linux-2.6.23.9'
CC [M] /home/mczim/programming/test/hellomod.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/mczim/programming/test/hellomod.mod.o
LD [M] /home/mczim/programming/test/hellomod.ko
make: Leaving directory `/usr/src/linux-2.6.23.9'
В директории /usr/src/linux-2.6.23.9 --лежат исходники ядра, на котором производилась данная сборка.
теперь мы готовы подгрузить наш модуль в ядро:
и смотрим в лог:
Jan 22 23:10:39 mczim-desktop kernel: [365908.733723] KERN_ALERT Hello, World! From the KERNEL space...
теперь выгрузим наш модуль из ядра:
продолжаем смотреть в лог:
Jan 22 23:12:42 mczim-desktop kernel: [366031.925420] KERN_ALERT Goodbye, World! Leaving KERNEL space...
Итак, мы сами написали свой собственный (хоть и не значительный) модуль для ядра Linux, подгрузили его убедились что он работает, а затем выгрузили его. Хочу напомнить что работа производилась с версией ядра 2.6.23.9, в версиях ядер 2.2.x.x и 2.4.x.x написание модулей, а так же их инсталяция в ядро происходит немного по другому.