【问题标题】:Linux kernel module development buildrootLinux内核模块开发buildroot
【发布时间】:2019-05-18 19:45:40
【问题描述】:

我已经使用 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

【问题讨论】:

  • 您使用哪个工具链来编译模块?您是直接在 beagle 或主机设备上编译代码吗?如果您希望在 beagle 上编译模块,则需要确保使用 gcc 和 dev 目录构建 buildroot。如果您希望在主机上编译,请确保构建 buildroot 工具链并使用它来编译模块,通常在发生此类错误时它指向错误的工具链
  • 感谢您的回答。起初我想在目标上构建,但无法让 gcc 在我的构建中“出现”。所以我使用 buildroot 创建的工具链进行 xcompile
  • 顺便说一句,一个普通的 hello world c 应用程序在主机上编译并在目标上正确运行

标签: c linux kernel beagleboneblack buildroot


【解决方案1】:

要编译内核模块,您需要真正的内核源代码,而不仅仅是内核头文件。你必须从内核源代码目录构建,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 本身。

【讨论】:

  • 我不确定内核源代码是否是先决条件,我有一些东西可以在没有源代码和适当的头文件的情况下工作。
  • 好吧,您确实不需要完整的资源。但是 uapi 标头肯定是不够的。你至少需要include/arch/xxx/asm、顶级Makefile、部分scripts/、...
  • 您好,谢谢您的回答。此时我不想在内核构建时将我的模块编译到内核中,而只是单独编译它并尝试在运行时加载它。您提到的事情似乎是我需要解决的更高级别的事情,但是一旦一切正常。我不确定我的标题目录是否正确。是否有任何参考如何使用 buildroot 提供的工具交叉编译模块(以及要包含哪些文件)?
  • 在我的主机设备上,我能够使用提供的教程构建一个测试模块:devarea.com/…。我认为 xcompile 的问题是我在 lib/modules 目录中没有构建目录。有什么具体的方法来构建这些吗?
  • 如答案中所写:一旦模块在本机正确编译后,例如devarea.com 指南,您可以使用内核模块基础设施将其作为交叉编译模块包含在 Buildroot 中。答案中引用了该文档,并进行了总结。你还需要什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 2013-12-17
  • 2018-10-28
相关资源
最近更新 更多