Разработка модуля ядра Linux buildroot - PullRequest
0 голосов
/ 18 декабря 2018

Я собрал ядро ​​Linux для beaglebone black, используя buildroot.Теперь я хотел бы разработать приложение модуля ядра Linux hello world:

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

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

Проблема в том, что я до сих пор пропускаю некоторые заголовочные файлы.Наконец собрав их все, я получаю ошибку, что код не компилируется (много ошибок, я не хочу вставлять их все).Что мне было интересно: либо я действительно включаю нужные файлы?

На данный момент у меня есть:

/home/lukasz/brl/Machine/beaglebone/build/linux-headers-a75d8e93056181d512f6c818e8627bd4554aaf92/include
/home/lukasz/brl/Machine/beaglebone/build/uboot-2018.01/arch/x86/include
/home/lukasz/brl/Machine/beaglebone/build/linux-headers-a75d8e93056181d512f6c818e8627bd4554aaf92/arch/arm/include/generated
/home/lukasz/brl/Machine/beaglebone/build/linux-headers-a75d8e93056181d512f6c818e8627bd4554aaf92/arch/arm/include
/home/lukasz/brl/Machine/beaglebone/build/linux-a75d8e93056181d512f6c818e8627bd4554aaf92/include

Мне немного странно, что включаемые файлы C и файлы asmтак разбросаны по каталогу.Есть ли какие-то ошибки в моем понимании темы здесь?

Моя версия для Linux:

# uname -a
Linux buildroot 4.9.59 #1 SMP Fri Oct 5 11:55:54 CEST 2018 armv7l GNU/Linux

1 Ответ

0 голосов
/ 18 декабря 2018

Для компиляции модуля ядра вам нужны настоящие исходные коды ядра, а не только заголовочные файлы ядра.Вы должны собрать из исходного каталога ядра с M=, указывающим на источник ваших модулей.И вместе с исходным модулем вам, конечно, также нужен рабочий Makefile.Эти шаги объяснены в любом из десятков руководств по написанию модулей ядра, например, этот .

Для кросс-компиляции вам также нужно передатьсоответствующие аргументы, чтобы ядро ​​знало, для какой архитектуры строить и какой кросс-компилятор использовать.По крайней мере, это означает, что вы должны указать опции ARCH= и CROSS_COMPILE= при сборке.Иногда вам нужны дополнительные опции (например, чтобы указать на соответствующий инструмент depmod).

Чтобы упростить это, Buildroot предлагает инфраструктура модуля ядра .В простейшем случае вы можете просто создать файл Config.in, содержащий

config BR2_PACKAGE_HELLOMOD
        bool "hellomod"
        depends on BR2_LINUX_KERNEL

и файл hellomod.mk, содержащий

HELLOMOD_SITE = /path/to/hellomod/source

$(eval $(kernel-module))
$(eval $(generic-package))

Вы также должны получить Config.in изpackage/Config.in в дереве Buildroot.Или, что еще лучше, используйте внешнее дерево , чтобы вам не приходилось изменять сам Buildroot.

...