Модули ядра
Данное руководство описывает процесс разработки модулей ядра для Embedded-Linux. Будет продемонстрировано создание простого модуля ядра.
Приводимые инструкции протестированы на конкретных релизах Buildroot. Название и расположение элементов и папок могут измениться в будущем.
Дополнительная информация:
Для разработки модулей ядра следует использовать ОС на базе GNU/Linux.
Подготовка
-
Скачать архив buildroot
- СКИФ
- 1892ВМ14Я
Ссылка на последний релиз - https://support.elvees.com/go/mcom03br
Протестировано на версии 2024.06
Ссылка на загрузку https://dist.elvees.com/mcom02/buildroot/nightly/latest/
Протестировано на версии 3.1.4
-
Распаковать и перейти в папку.
-
Запуск сборки Buildroot
- СКИФ
- 1892ВМ14Я
./docker-build.sh make mcom03_defconfig
./docker-build.sh makeПодробнее про сборку и настройку: https://dist.elvees.com/mcom03/docs/linux-sdk/latest/components/buildroot.html
./docker-build.sh make mcom_defconfig
./docker-build.sh makeПодробнее про сборку и настройку: https://dist.elvees.com/mcom02/docs/buildroot/latest/components/buildroot.html
подсказкаДля правильной работы и сборки рекомендуется использовать docker.
Написание драйвера
-
Создадим папку drivers.
-
В ней создадим Makefile.
-
В Makefile добавляем содержимое:
- СКИФ
- 1892ВМ14Я
MakefileCFILES := hello-module.c
hello-driver-objs := $(CFILES:.c=.o)
obj-m := hello-module.o
CROSS_COMPILE ?= "$(BR_HOME)/buildroot/output/host/bin/aarch64-buildroot-linux-gnu-"
KERNELDIR ?= "$(BR_HOME)/buildroot/output/build/linux-mcom03-5.10.y"
PWD := $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=arm64 CROSS_COMPILE=$(CROSS_COMPILE) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) cleanMakefileCFILES := hello-module.c
hello-driver-objs := $(CFILES:.c=.o)
obj-m := hello-module.o
CROSS_COMPILE ?= "$(BR_HOME)/buildroot/output/host/bin/arm-buildroot-linux-gnueabihf-"
KERNELDIR ?= "$(BR_HOME)/buildroot/output/build/linux-2736ca0966d78185f82fc9356664b8ccd1b2ac64"
PWD := $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) cleanwarningОтступы должны быть Tab-ами а не пробелами.
Название директории с ядром может измениться в будущих релизах.
-
Создадим hello-module.c с содержимым
hello-module.c#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ELVEES");
MODULE_DESCRIPTION("A sample driver");
static int __init hello_init(void)
{
pr_info("Hello, world\n");
return 0;
}
static void __exit hello_exit(void)
{
pr_info("Goodbye, world\n");
}
module_init(hello_init);
module_exit(hello_exit);
Сборка
Модули ядра необходимо линковать с kernel-headers. В обычных дистрибутивах это отдельный пакет, который устанавливается через пакетный менеджер.
- Для Buildroot MCom-03 kernel-headers расположены в
mcom03-defconfig-src/buildroot/output/build/linux-mcom03-5.10.y
. - Для Buildroot MCom-02 –
mcom02-buildroot-v3.1.4-111-gedf1e68-2022-03-10/buildroot/output/build/linux-2736ca0966d78185f82fc9356664b8ccd1b2ac64
.
make BR_HOME=/home/user/<path_to_buildroot>
Где в переменную BR_HOME
устанавливается путь до корневой директории Buildroot.
После сборки можно посмотреть информацию о модуле:
$ modinfo hello-module.ko
filename: /home/user/dev/hello-module/hello-module.ko
description: A sample driver
author: ELVEES
license: GPL
depends:
name: hello_module
vermagic: 5.10.179 SMP mod_unload aarch64
make BR_HOME=/home/user/<path_to_br> clean
Запуск на плате
Скопировать файл модуля на целевую ОС.
Загрузим модуль:
insmod hello_module.ko
Посмотрим логи и lsmod:
# lsmod | grep hello
hello_module 16384 0
# dmesg | tail
[ 17.319697] random: crng init done
[ 18.513925] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[ 18.535125] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[ 18.554795] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[ 18.564599] cfg80211: failed to load regulatory.db
[ 19.390772] arasan-gemac 10200000.ethernet end0: attached PHY driver [TI DP83867]
[ 19.433246] arasan-gemac 10210000.ethernet end1: attached PHY driver [TI DP83867]
[ 23.600116] arasan-gemac 10210000.ethernet end1: link up (1000/Full)
[ 23.607335] IPv6: ADDRCONF(NETDEV_CHANGE): end1: link becomes ready
[ 177.527030] Hello, world
Выгрузим модуль:
# rmmod hello-module.ko
[ 353.766176] Goodbye, world
Версия и конфигурация Linux на ПК должны соответствовать версии Linux на целевой платформе.
Сложные драйверы, требующе различных зависимостей, рекомендуется интегрировать в Buildroot и подключать в linux-menuconfig. Для сборки вместе с системой и ядром.
Руководство протестировано на отладочных комплектах:
- ELV-MC03-SMARC r.1.1 и ELV-SMARC-CB r2.10 с Buildroot 2024.06
- Салют-ЭЛ24ПМ2 r1.1 и Салют-ЭЛ24ОМ1 r1.2 с Buildroot 3.1.4 (режим загрузки distro)