Ник:
Пароль:

Контакты

Cтатус Skype: starterkit.ru
тел.: (+7 3412) 478-448
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
E-mail: info@starterkit.ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:2
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » Embedded Linux
Сборка нового модуля ядра, боль и страдания
SmartRogue
Добавлено 09.04.2020 14:33 Редактировалось 09.04.2020 14:34
0
Сообщение: 1
SmartRogue
0

Пункты: 1449
Регистрация: 27.11.2017
Здравствуйте.
Мне нужно написать собственный маленький модуль и поместить его в пространство ядра.

N.B. Ничего из сделанного ранее уже не поменять, в том числе выбранный линукс.

В наличии:
SK-iMX6S-OEM-Ind
SK-iMX6S/53/50-MB
buildroot-2017.08 на базе ядра 4.1.15-2.1.0 для i.mx6 от sasamy (тык).
Дебиан 9.3, модифицированный sasamy (тык).

Что сделал:
1. Собрал загрузчик и dtb билдрутом.
2. Создал симлинк на билд:
Код

sudo ln -s /lib/modules/4.1.15-25-boundary-12s/build /lib/modules/4.1.15/build

3. Положил в /usr/src/linux-headers-4.1.15-25-boundary-12s файлы .config и Module.symvers из выхлопа buildroot ( _/output/build/linux-custom/ ).
4. Написал модуль а-ля hello world, только для ядра.
5. Выполнил make - получил:
Код

make
make -C /lib/modules/4.1.15/build M=/home/debian/hello modules
make[1]: Entering directory '/usr/src/linux-headers-4.1.15-25-boundary-12s'
Makefile:10: *** mixed implicit and normal rules: deprecated syntax
CC [M] /home/debian/hello/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/debian/hello/hello.mod.o
LD [M] /home/debian/hello/hello.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.1.15-25-boundary-12s'

6. Попытался вставить модуль в ядро, получил:
Код

sudo insmod hello.ko
[sudo] password for debian:
Segmentation fault

В выхлопе dmesg ничего.

К слову, на компьютере тоже в дебиан 9 код конечно же работает и даёт вот такой выхлоп:
Код

sudo dmesg | grep hello.ko
[ 6552.717391] hello.ko: hello kernel
[ 6662.713261] hello.ko: bye kernel


Содержимое файлов:
Makefile
Код

obj-m += hello.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean


hello.c
Код

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

static int __init hello_init(void)
{
printk(KERN_ERR "hello.ko: hello kernel");
return 0;
}

static void __exit hello_exit(void)
{
printk(KERN_ERR "hello.ko: bye kernel");
return;
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");


Ранее я уже пытался на плате собирать модуль драйвера сетевой карты, но всё тоже не увенчалось успехом.

Вопросы:
1. Что я опять делаю не так?
2. Что мне нужно сделать, чтобы собрать собственный модуль ядра для этого линукса?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 09.04.2020 15:24 Редактировалось 09.04.2020 19:09 Сообщение: 2
sasamy
4.77

Пункты: 57420
Регистрация: 14.08.2009
Цитата

Что сделал:
1. Собрал загрузчик и dtb билдрутом.
...
3. Положил в /usr/src/linux-headers-4.1.15-25-boundary-12s файлы .config и Module.symvers из выхлопа buildroot ( _/output/build/linux-custom/ ).


если ядро не менялось и используется от boundary - не надо было ничего менять а собрать с тем что было в оигинале. Если ядро заменено тем что собрано в buidroot то проще собирать модуль на хосте кросскомпилятором и тоже ничего менять не надо.
Мне кажется вы по второму кругу начали обсуждение - я это уже пытался объяснить.

В общем случае - замените ядро, модули, загрузчик, DTB тем что собрано в buildroot

Чтобы собрать модуль, сделайте такой Makefile

Цитата

obj-m := hello.o

KDIR ?= /lib/modules/`uname -r`/build

all:
$(MAKE) -C $(KDIR) M=$$PWD
clean:
$(MAKE) -C $(KDIR) M=$$PWD clean


собирать так

export ARCH=arm
export CROSS_COMPILE=/home/user/buildroot/output/host/bin/arm-linux-gnueabihf-
export KDIR=/home/user/buildroot/output/build/linux-custom

make

/home/user/buildroot/ - путь к buildroot в котором собрано ядро

Тут собранные исходники ядра которое я подменил в архиве корневой (Дебиан 9.3, модифицированный sasamy (тык).) - совсем забыл что там не оригинальное ядро boundary

https://yadi.sk/d/MxmIA1889YKt9g

соответственно .config и Module.symvers от ядра если что можно оттуда взять, то что собрано у вас бесполезно подсовывать если ядро не меняли на своё.
Спуститься к концу Подняться к началу
Персональная информация
SmartRogue
Добавлено 09.04.2020 19:51 Сообщение: 3
SmartRogue
0

Пункты: 1449
Регистрация: 27.11.2017
Цитата

В общем случае - замените ядро, модули, загрузчик, DTB тем что собрано в buildroot


Можно об этом поподробнее? Если честно, для меня всё это магия.

Я действую так, как Вы мне ранее объясняли: настраиваю конфиг в билдрут, добавляю там поддержку galcore, собираю. По окончании сборки целиком беру папку output/images и кладу в аналогичную в папке с Вашим дебианом, а затем запускаю mk-sd.sh

То, что я делаю, этого недостаточно?

Или если я сейчас соберу модуль на хост машине по указанному способу кросс-компиляции, он заработает?

Большое спасибо за то, что помогаете и делитесь знаниями с тёмным мной))
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 09.04.2020 20:32 Сообщение: 4
sasamy
4.77

Пункты: 57420
Регистрация: 14.08.2009
Цитата

По окончании сборки целиком беру папку output/images и кладу в аналогичную в папке с Вашим дебианом, а затем запускаю mk-sd.sh


значит и ядро заменяете а пишете что только загрузчик и DTB, вам кажется что это неважно а это всё меняет. Соберите тогда как я описал с моим Makefile и закиньте полученный модуль на плату любым способом - должно работать
Спуститься к концу Подняться к началу
Персональная информация
SmartRogue
Добавлено 09.04.2020 21:04 Сообщение: 5
SmartRogue
0

Пункты: 1449
Регистрация: 27.11.2017
Цитата
значит и ядро заменяете а пишете что только загрузчик и DTB, вам кажется что это неважно а это всё меняет.


Я ж честно говорю, что нуб...))

Цитата
Соберите тогда как я описал с моим Makefile и закиньте полученный модуль на плату любым способом - должно работать


Спасибо! Щас попробую.
Спуститься к концу Подняться к началу
Персональная информация
SmartRogue
Добавлено 09.04.2020 22:18 Сообщение: 6
SmartRogue
0

Пункты: 1449
Регистрация: 27.11.2017
Цитата
должно работать


Заработало! Ура! Спасибо! Вы волшебник!
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux