微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何编译树莓派的内核模块?

我无法编译一个树莓派的内核模块。 我想用树莓派本身编译一个“hello world”内核模块。

我正在使用raspbian wheezy 3.6.11+。

我试着按照http://elinux.org/RPi_Kernel_Compilation的指示。

这里是我正在使用的Makefile:

sqlcipher ./configuration linux

可以在Windows上运行Docker中的ARM / rpi映像,但不能运行linux

树莓派ad-hocnetworking

找出启动RaspBerry Pi / Linux的启动方式

/ usr / bin / env:ruby_executable_hooks:没有这样的文件或目录

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+创build生成目录

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

任何想法,我可以做什么来得到这个编译?

PHP不能从网页执行在树莓派上执行

terminalclosures时终止sudo python脚本

PHP的setlocale不起作用

尝试使用JConsole连接到RaspBerryPi jvm

如何在自己的机器上设置Node服务器进行生产?

编译模块时, -C参数应指向内核所在的源代码树(不要清理它!)。 如果你在pi目录下的目录下创建它。

/lib/modules/<version>目录下的build目录是一个Debian-ism,在这个目录下,源代码树的精简版本提供了足够的上下文来构建模块。 来自RaspBerry Pi Foundation内核的内核不附带build目录。

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

sudo aptitude install linux-image-rpi-rpfv linux-headers-rpi-rpfv

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

执行sudo rpi-update

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

安装并运行rpi-source来安装构建您正在运行的最新内核的源代码。 这将在你正在运行的内核的/lib/modules创建正确的入口。 注意:你不需要root来运行这个脚本,然而这个脚本会使用sudo来执行某些任务,并且在脚本执行过程中会被请求root密码

可以在https://github.com/notro/rpi-source/wiki找到安&#x88C5;rpi-source说明

一旦执行了这些步骤,您应该可以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!

你首先需要内核头文件(和相应的内核二进制文件)来构建你的模块。

像Greg说的那样,raspbian发行版提供了这样的软件包:

sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv

然后,告诉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

然后,修改你的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

这是一个痛苦。 我不得不编译和安装一个内核模式驱动程序。长时间搜索后,我从这里得到了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

我正在使用完全相同的内核来处理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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐