Перейти к основному содержимому

Модули ядра

Данное руководство описывает процесс разработки модулей ядра для Embedded-Linux. Будет продемонстрировано создание простого модуля ядра.

примечание

Приводимые инструкции протестированы на конкретных релизах Buildroot. Название и расположение элементов и папок могут измениться в будущем.

Дополнительная информация:

Для разработки модулей ядра следует использовать ОС на базе GNU/Linux.

Подготовка

  1. Скачать архив buildroot

    Ссылка на последний релиз - https://support.elvees.com/go/mcom03br

    Протестировано на версии 2024.06

  2. Распаковать и перейти в папку.

  3. Запуск сборки Buildroot

    ./docker-build.sh make mcom03_defconfig
    ./docker-build.sh make

    Подробнее про сборку и настройку: https://dist.elvees.com/mcom03/docs/linux-sdk/latest/components/buildroot.html

    подсказка

    Для правильной работы и сборки рекомендуется использовать docker.

Написание драйвера

  • Создадим папку drivers.

  • В ней создадим Makefile.

  • В Makefile добавляем содержимое:

    Makefile
    CFILES := 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) clean
    warning

    Отступы должны быть 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)