Linux内核模块开发buildroot

时间:2018-12-18 11:38:46

标签: c linux kernel beagleboneblack buildroot

我已经使用buildroot为beaglebone black构建了Linux内核。现在,我想开发一个hello world Linux内核模块应用程序:

#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 :(得分:2)

要编译内核模块,您需要真正的内核源代码,而不仅仅是内核头文件。您必须从内核源目录进行构建,其中M=指向模块的源。当然,连同模块源一起,您还需要一个有效的Makefile。这些步骤在数十种如何编写内核模块指南中都有介绍,例如this one

对于交叉编译,您还需要传递适当的参数,以便内核知道要构建哪种体系结构以及要使用哪个交叉编译器。至少,这意味着在构建时必须提供ARCH=CROSS_COMPILE=选项。有时您需要其他选项(例如,指向相应的depmod工具)。

为简化此过程,Buildroot提供了kernel module infrastructure。在最简单的情况下,您只需创建一个包含{p>的Config.in文件

config BR2_PACKAGE_HELLOMOD
        bool "hellomod"
        depends on BR2_LINUX_KERNEL

和一个包含{p>的hellomod.mk文件

HELLOMOD_SITE = /path/to/hellomod/source

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

您还必须从Buildroot树中的Config.in中获取package/Config.in。或者更好的方法是使用external tree,这样就不必修改Buildroot本身。