linux - 如何为树莓派编译内核模块?

标签 linux makefile raspberry-pi kernel-module raspbian

我在为树莓派编译内核模块时遇到问题。我想使用树莓派本身编译一个“hello world”内核模块。

我正在使用 raspbian wheezy 3.6.11+。

我尝试按照 http://elinux.org/RPi_Kernel_Compilation 中的说明进行操作.

这是我正在使用的 Makefile:

obj-m += hello-1.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

这里是 hello-1.c 的源代码:

/*  
 *  hello-1.c - The simplest kernel module.
 */
#include <linux/module.h>   /* Needed by all modules */
#include <linux/kernel.h>   /* Needed for KERN_INFO */

int init_module(void)
{
    printk(KERN_INFO "Hello world 1.\n");

    /* 
     * A non 0 return means init_module failed; module can't be loaded. 
     */
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world 1.\n");
}

这是我尝试制作项目时得到的结果:

root@raspberrypi:/home/pi/hello-module# make
make -C /lib/modules/3.6.11+/build M=/home/pi/hello-module modules
make: *** /lib/modules/3.6.11+/build: No such file or directory.  Stop.
make: *** [all] Error 2

我尝试在/lib/modules/3.6.11+ 创建构建目录

make -C /lib/modules/3.6.11+/build M=/home/pi/hello-module modules
make[1]: Entering directory `/lib/modules/3.6.11+/build'
make[1]: *** No rule to make target `modules'.  Stop.
make[1]: Leaving directory `/lib/modules/3.6.11+/build'
make: *** [all] Error 2

我安装了 GNU Make 3.81 和 gcc (Debian 4.6.3-14+rpi1) 4.6.3。我还使用

安装了 linux 源

sudo apt-get install linux-source

关于我可以做些什么来编译它有什么想法吗?

最佳答案

以下是我用来构建 Hello World kernel module 的步骤在 Raspbian 上。

  1. 执行sudo rpi-update

    https://github.com/Hexxeh/rpi-update有关详细信息 rpi-更新。您必须使用最新的固件和关联的内核才能执行下一步。

  2. 安装并运行 rpi-source 以安装构建您正在运行的最新内核的源代码。这将为您正在运行的内核在 /lib/modules 中创建正确的条目。注意:您无需成为 root 用户即可运行此脚本,但是该脚本将使用 sudo 执行某些任务,并且在脚本执行期间将请求 root 密码。

    安装 rpi-source 的说明可以在 https://github.com/notro/rpi-source/wiki 找到

执行这些步骤后,您应该能够制作 Hello World 内核模块。

johnma@raspberrypi ~/HelloWorld $ make
make -C /lib/modules/3.12.19+/build M=/home/johnma/HelloWorld modules
make[1]: Entering directory `/home/johnma/linux-c3db7205bcd8988cf7c185e50c8849542554b1f5'
  CC [M]  /home/johnma/HelloWorld/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/johnma/HelloWorld/hello.mod.o
  LD [M]  /home/johnma/HelloWorld/hello.ko
make[1]: Leaving directory `/home/johnma/linux-c3db7205bcd8988cf7c185e50c8849542554b1f5'

johnma@raspberrypi ~/HelloWorld $ sudo insmod hello.ko
johnma@raspberrypi ~/HelloWorld $ tail -1 /var/log/syslog
May 15 13:45:39 raspberrypi kernel: [59789.169461] Hello World :)

johnma@raspberrypi ~/HelloWorld $ sudo rmmod hello.ko
johnma@raspberrypi ~/HelloWorld $ tail -1 /var/log/syslog
May 15 13:46:10 raspberrypi kernel: [59819.503503] Goodbye World!

关于linux - 如何为树莓派编译内核模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20167411/

相关文章:

c++ - fcgio.cpp :50: error: 'EOF' was not declared in this scope

javascript - 从 Node.js 服务器修改 HTML 网站以显示文件数据

Python 脚本仅使用 "python"命令运行

c++ - 即使使用 -Wall 标志,gcc 也不会发出警告

c++ - 生成文件:6:目标 'all' 的配方在 ubuntu-16.04 上失败

java - 使用 SSH 将文件从 Android 应用程序发送到树莓派

python - Raspberry PI 3、串行端口和奇怪的响应

c++ - Linux 性能监控,有什么方法可以监控每个线程?

java - 如何解决 groovy/grails 工具套件引用?

linux - setsockopt IPT_SO_SET_REPLACE 标志返回错误(linux)