簡體   English   中英

無法為BeagleBone Debian編譯內核模塊

[英]Can't compile kernel module for BeagleBone Debian

我正在遵循Derek Molloys的指南來構建可加載的內核模塊,但是在某些時候會遇到困難。

我在.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);

和這樣的makefile: Makefile

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建議的此鏈接上找到與之完全匹配的頭文件,因此我改為下載3.8.13-bone71 這可能是問題嗎? 直接在BeagleBone上編譯時,是否必須下載標頭? 我也嘗試過將Makefile中的行更改為與我的(3.8.13-bone47)匹配的硬編碼發行版名稱,也不起作用。

非常感謝你們!

我解決了我的問題。 我有兩個問題:

Makefile中缺少選項卡我用make語句在每行的開頭添加了一個選項卡。 它必須是一個實際的選項卡,<\\ t>不適用於我。

錯誤的頭文件事實證明, 頭文件的正確版本非常重要:)我從http://rcn-ee.net/deb/trusty-armhf/v3.8.13-bone47/獲得了文件,並添加了mach /timex.h文件,此后便可以遵循Derek的指南。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM