Linux 内核模块开发buildroot
Linux kernel module development 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
要编译内核模块,您需要真正的内核源代码,而不仅仅是内核头文件。您必须使用 M=
指向模块源的内核源目录进行构建。除了您的模块源代码,您当然还需要一个有效的 Makefile。这些步骤在许多如何编写内核模块指南中都有解释,例如this one.
对于交叉编译,您还需要传递适当的参数,以便内核知道要构建哪种体系结构以及使用哪个交叉编译器。至少,这意味着您必须在构建时提供 ARCH=
和 CROSS_COMPILE=
选项。有时您需要额外的选项(例如指向适当的 depmod 工具)。
为了简化这一点,Buildroot 提供了 kernel module infrastructure。在最简单的情况下,您可以只创建一个包含
的 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))
您还必须从 Buildroot 树中的 package/Config.in
获取 Config.in
。或者更好的是,使用 external tree 这样您就不必修改 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
要编译内核模块,您需要真正的内核源代码,而不仅仅是内核头文件。您必须使用 M=
指向模块源的内核源目录进行构建。除了您的模块源代码,您当然还需要一个有效的 Makefile。这些步骤在许多如何编写内核模块指南中都有解释,例如this one.
对于交叉编译,您还需要传递适当的参数,以便内核知道要构建哪种体系结构以及使用哪个交叉编译器。至少,这意味着您必须在构建时提供 ARCH=
和 CROSS_COMPILE=
选项。有时您需要额外的选项(例如指向适当的 depmod 工具)。
为了简化这一点,Buildroot 提供了 kernel module infrastructure。在最简单的情况下,您可以只创建一个包含
的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))
您还必须从 Buildroot 树中的 package/Config.in
获取 Config.in
。或者更好的是,使用 external tree 这样您就不必修改 Buildroot 本身。