【问题标题】:Can't compile kernel module for BeagleBone Debian无法为 BeagleBone Debian 编译内核模块
【发布时间】:2015-10-01 14:22:59
【问题描述】:

我正在关注 Derek Molloys guide 来构建可加载的内核模块,但在某些时候会变得僵硬。

我在 .c 文件中有内核代码: hello.c

#include <linux/init.h>             // Macros used to mark up functions e.g., __init __exit
#include <linux/module.h>           // Core header for loading LKMs into the kernel
#include <linux/kernel.h>           // Contains types, macros, functions for the kernel

MODULE_LICENSE("GPL");              ///< The license type -- this affects runtime behavior
MODULE_AUTHOR("Derek Molloy");      ///< The author -- visible when you use modinfo
MODULE_DESCRIPTION("A simple Linux driver for the BBB.");  ///< The description -- see modinfo
MODULE_VERSION("0.1");              ///< The version of the module

static char *name = "world";        ///< An example LKM argument -- default value is "world"
module_param(name, charp, S_IRUGO); ///< Param desc. charp = char ptr, S_IRUGO can be read/not changed
MODULE_PARM_DESC(name, "The name to display in /var/log/kern.log");  ///< parameter description

/** @brief The LKM initialization function
 *  The static keyword restricts the visibility of the function to within this C file. The __init
 *  macro means that for a built-in driver (not a LKM) the function is only used at initialization
 *  time and that it can be discarded and its memory freed up after that point.
 *  @return returns 0 if successful
 */
static int __init helloBBB_init(void){
   printk(KERN_INFO "EBB: Hello %s from the BBB LKM!\n", name);
   return 0;
}

/** @brief The LKM cleanup function
 *  Similar to the initialization function, it is static. The __exit macro notifies that if this
 *  code is used for a built-in driver (not a LKM) that this function is not required.
 */
static void __exit helloBBB_exit(void){
   printk(KERN_INFO "EBB: Goodbye %s from the BBB LKM!\n", name);
}

/** @brief A module must use the module_init() module_exit() macros from linux/init.h, which
 *  identify the initialization function at insertion time and the cleanup function (as
 *  listed above)
 */
module_init(helloBBB_init);
module_exit(helloBBB_exit);

生成文件如下: 制作文件

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

当我尝试在仅包含上述两个文件的目录中运行 make 时,我得到了

Make:无事可做

我正在运行 3.8.13-bone47,但我无法找到与 Derek 推荐的 link 匹配的确切头文件,因此我下载了 3.8。 13-bone71 代替。这可能是问题吗?当我直接在 BeagleBone 上编译时,是否必须下载标头?我还尝试将 Makefile 中的行更改为与我的匹配的硬编码发行版名称(3.8.13-bone47),也不起作用。

非常感谢你们!

【问题讨论】:

  • 您将目标文件定义为可加载模块,要编译它,您必须使用make modules。检查头文件和文件的路径。你确定你的文件夹甚至被认为是构建的吗?
  • 配方中的每一行都必须以制表符开头。您忘记了make ... 命令之前的制表符。
  • 放入选项卡使其编译。尽管现在我得到 2 个错误:/lib/modules/3.8.13-bone47/build/: 没有这样的文件或目录所以它找不到我的标题。你觉得我可以用这些吗:rcn-ee.net/deb/wheezy-armhf/v3.8.13-bone47

标签: linux makefile linux-kernel debian beagleboneblack


【解决方案1】:

我解决了我的问题。我有两个问题:

Makefile 中缺少标签 我使用 make 语句在每行的开头添加了一个制表符。它必须是一个实际的选项卡, 对我不起作用。

错误的头文件 事实证明,正确版本的头文件非常重要 :) 我从 http://rcn-ee.net/deb/trusty-armhf/v3.8.13-bone47/ 得到了那些并添加了 mach/timex.h 文件,并且从那时起就能够按照 Derek 的指南进行操作了。

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2019-03-05
    • 2014-12-23
    • 2014-12-15
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多