如何为Raspberry pi编译内核模块?

use*_*582 25 linux makefile kernel-module raspberry-pi raspbian

我在为raspberry pi编译内核模块时遇到了麻烦.我想使用raspberry pi本身编译一个"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
Run Code Online (Sandbox Code Playgroud)

这是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");
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我尝试在/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
Run Code Online (Sandbox Code Playgroud)

我安装了GNU Make 3.81和gcc(Debian 4.6.3-14 + rpi1)4.6.3.我也用linux安装了linux源代码

sudo apt-get install linux-source

关于我可以做些什么来进行编译的任何想法?

Gre*_*reg 13

编译模块时,-C参数应指向构建内核的源树(不要清理它!).如果你在pi上构建它可能在你的主目录下的目录中.

下面的build目录/lib/modules/<version>是Debian-ism,其中源树的简化版本提供了足够的上下文来构建模块.Raspberry Pi Foundation内核的内核不附带build目录.

它们可能有点过时,但raspbian提供了一个内核作为Debian风格的包,它应该包含build你可以用来构建内核模块的目录.

sudo aptitude install linux-image-rpi-rpfv linux-headers-rpi-rpfv
Run Code Online (Sandbox Code Playgroud)


Hea*_*ohn 13

以下是我在Raspbian上构建Hello World内核模块的步骤.

  1. 演出 sudo rpi-update

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

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

    有关安装的说明,请rpi-source访问https://github.com/notro/rpi-source/wiki

执行这些步骤后,您应该能够make使用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!
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,这对我很有帮助.我唯一的打嗝是运行`rpi-source`.我遇到一个Python错误,说它无法找到/proc/config.gz.运行`sudo modprobe configs`修复它. (2认同)

Jay*_*Dee 9

首先需要内核头文件(以及相应的内核二进制文件)来构建模块.
就像Greg说的那样,raspbian发行版提供了包:

sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv
Run Code Online (Sandbox Code Playgroud)

然后,告诉raspbian启动你新安装的内核(对我来说是3.10-3-rpi).
将其添加到最后/boot/config.txt并重启你的Pi:

# Parameters to boot on raspbian kernel (linux-image-rpi-rpfv package)
kernel=vmlinuz-3.10-3-rpi
initramfs initrd.img-3.10-3-rpi followkernel
Run Code Online (Sandbox Code Playgroud)

然后,修改Makefile以指向新安装的内核头文件:

KERNEL_HEADERS=/lib/modules/$(shell uname -r)/build

obj-m := hello-1.o

all:
    @$(MAKE) -C $(KERNEL_HEADERS) M=$(PWD) modules

clean:      
    @$(MAKE) -C $(KERNEL_HEADERS) M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)


Ryu*_*usa 8

这是一种痛苦.我不得不编译并安装内核模式驱动程序.经过长时间的搜索,我从这里获得了pi 2(3.18.7-v7 +)的头文件.

sudo apt-get install dkms build-essential
wget http://www.niksula.hut.fi/~mhiienka/Rpi/linux-headers-rpi/linux-headers-3.18.7-v7%2b_3.18.7-v7%2b-2_armhf.deb
sudo dpkg -i linux-headers-3.18.7-v7+_3.18.7-v7+-2_armhf.deb
Run Code Online (Sandbox Code Playgroud)


cst*_*ick 0

我正在使用完全相同的内核在 RPI 上处理完全相同的示例。我设法在 RPI 上编译该模块,但当我发出 insmod 时收到错误。我在 XUbuntu 虚拟机上按照此处的说明进行操作(使用我的 RPI 内核版本 3.6.y),它运行得很好。不知道为什么直接在 RPI 上编译不起作用,这将是另一天的问题。

我必须更改 Makefile 以匹配新环境。

obj-m += hello-1.o

all:
        make ARCH=arm CROSS_COMPILE=${CCPREFIX} -C /home/cstick/rpi/linux-rpi-3.6.y M=$(PWD) modules
clean:
        make -C /home/cstick/rpi/linux-rpi-3.6.y M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)