Модули ядра
Данное руководство описывает процесс разработки модулей ядра для Embedded-Linux. Будет продемонстрировано создание простого модуля ядра.
Приводимые инструкции протестированы на конкретных релизах Buildroot. Название и расположение элементов и папок могут измениться в будущем.
Дополнительная информация:
Для разработки модулей ядра следует использовать ОС на базе GNU/Linux.
Подготовка
-
Скачать архив buildroot
- СКИФ
- 1892ВМ14Я
- К1892ВМ21Я
Ссылка на последний релиз - https://support.elvees.com/go/mcom03br
Протестировано на версии 2024.06
Ссылка на последний релиз - https://support.elvees.com/go/mcom02br
Протестировано на версии 2025.06
Ссылка на последний релиз - https://support.elvees.com/go/mcom03rbr
Протестировано на версии 2025.09
-
Распаковать и перейти в папку.
-
Запуск сборки Buildroot
- СКИФ
- 1892ВМ14Я
- К1892ВМ21Я
./docker-build.sh make mcom03_defconfig./docker-build.sh makeПодробнее про сборку и настройку: https://dist.elvees.com/mcom03/docs/linux-sdk/2025.05/buildroot.html
./docker-build.sh make mcom02_defconfig./docker-build.sh makeПодробнее про сборку и настройку: https://dist.elvees.com/mcom02/docs/buildroot/latest/buildroot.html
./docker-build.sh make mcom03r_defconfig./docker-build.sh makeПодробнее про сборку и настройку: https://dist.elvees.com/mcom03r/docs/linux-sdk/latest/buildroot.html
подсказкаДля правильной работы и сборки рекомендуется использовать docker.
Написание драйвера
-
Создадим папку drivers.
-
В ней создадим Makefile.
-
В Makefile добавляем содержимое:
- СКИФ
- 1892ВМ14Я
- К1892ВМ21Я
MakefileCFILES := hello-module.chello-driver-objs := $(CFILES:.c=.o)obj-m := hello-module.oCROSS_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) modulesclean:$(MAKE) -C $(KERNELDIR) M=$(PWD) cleanMakefileCFILES := hello-module.chello-driver-objs := $(CFILES:.c=.o)obj-m := hello-module.oCROSS_COMPILE ?= "$(BR_HOME)/buildroot/output/host/bin/arm-buildroot-linux-gnueabihf-"KERNELDIR ?= "$(BR_HOME)/buildroot/output/build/linux-mcom02-5.4.y"PWD := $(shell pwd)all:$(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modulesclean:$(MAKE) -C $(KERNELDIR) M=$(PWD) cleanMakefileCFILES := hello-module.chello-driver-objs := $(CFILES:.c=.o)obj-m := hello-module.oCROSS_COMPILE ?= "$(BR_HOME)/buildroot/output/host/bin/aarch64-buildroot-linux-gnu-"KERNELDIR ?= "$(BR_HOME)/buildroot/output/build/linux-mcom03-6.6.y"PWD := $(shell pwd)all:$(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=arm64 CROSS_COMPILE=$(CROSS_COMPILE) modulesclean:$(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 расположены в
$BR_HOME/buildroot/output/build/linux-mcom03-5.10.y. - Для Buildroot MCom-02 Linux 5.4 –
$BR_HOME/buildroot/output/build/linux-mcom02-5.4.y. - Для Buildroot MCom-02 Linux 4.4 –
$BR_HOME/buildroot/output/build/linux-mcom02-4.4.y. - Для Buildroot MCom-03R Linux 6.6 –
$BR_HOME/buildroot/output/build/linux-mcom03-6.6.y.
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 r1.1 и ELV-SMARC-CB r2.10 с Buildroot 2024.06.
- Салют-ЭЛ24ПМ2 r1.1 и Салют-ЭЛ24ОМ1 r1.2 с Buildroot 2025.06.
- ELV-MC03-SMARC r3.0 ELV-SMARC-CB r3.3 с Buildroot 2025.09.