Первый модуль ядра: garvis_greet
Введение
В этом разделе мы создадим простой модуль ядра Linux под названием garvis_greet — это наш индивидуальный Hello World.
Этот модуль напечатает сообщение в журнал ядра при загрузке и выгрузке, представляясь как «Garvis» — ваш новый друг в мире драйверов.
Мы будем использовать Raspberry Pi 3, подключённый по SSH, а ядро и сборка будут выполняться локально.
Теория: как устроен модуль ядра
Модуль ядра — это двоичный объект (.ko), который можно загружать и выгружать в ядро без его перекомпиляции. Основные компоненты:
#include <linux/init.h>— директивы для функций инициализации#include <linux/module.h>— макросы и типы для работы с модулямиmodule_init()/module_exit()— точки входа и выходаprintk()— логирование в ядро
Создание проекта garvis_greet
Структура каталога:
garvis_greet/ ├── garvis_greet.c ├── Makefile └── demo_garvis_greet.sh
Исходный код модуля:
garvis_greet.c
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("You");
MODULE_DESCRIPTION("Garvis говорит из ядра!");
static int __init garvis_init(void) {
printk(KERN_INFO "Garvis говорит: Привет из ядра Linux!\\n");
return 0;
}
static void __exit garvis_exit(void) {
printk(KERN_INFO "Garvis уходит: До встречи!\\n");
}
module_init(garvis_init);
module_exit(garvis_exit);
Makefile
obj-m += garvis_greet.o
all:
make -C ../linux M=$(PWD) modules
clean:
make -C ../linux M=$(PWD) clean
Скрипт запуска:
demo_garvis_greet.sh
#!/bin/bash
echo " Проверка: загружен ли модуль garvis_greet..."
if lsmod | grep -q garvis_greet; then
echo " Модуль уже загружен. Удаляем..."
sudo rmmod garvis_greet
fi
echo " 1. Очистка предыдущей сборки (на всякий случай)..."
make clean
echo " 2. Повторная сборка драйвера..."
make
echo " 3. Загрузка модуля garvis_greet.ko в ядро..."
sudo insmod garvis_greet.ko
echo " 4. Чтение последних сообщений ядра (dmesg)..."
echo "---------------------------------------------"
dmesg | tail -n 10
echo "---------------------------------------------"
echo " Выше вы должны увидеть сообщение от Garvis!"
read -p " Нажмите [Enter] для удаления модуля..."
echo " Удаление модуля из ядра..."
sudo rmmod garvis_greet
echo " Готово! Модуль выгружен."
Не забудьте:
chmod +x demo_garvis_greet.sh
Сборка и запуск на Raspberry Pi
Убедитесь, что у вас локальная сборка ядра или headers:
git clone --depth=1 https://github.com/raspberrypi/linux
cd linux
KERNEL=kernel7
make bcm2709_defconfig
Вернитесь в каталог
garvis_greetи запустите:
./demo_garvis_greet.sh
Вывод в dmesg должен содержать:
Garvis говорит: Привет из ядра Linux!
Вывод
Вы создали, собрали, загрузили и выгрузили свой первый модуль ядра Linux. Поздравляем! Вы теперь знаете, как Garvis передаёт привет из ядра
В следующем модуле мы добавим взаимодействие с пользователем через /proc или /sys.