我在为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
以下是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
关于我可以采取什么措施来编译它?
答案 0 :(得分: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
答案 1 :(得分:12)
以下是我在Raspbian上构建Hello World kernel module的步骤。
执行sudo rpi-update
有关详细信息,请参阅https://github.com/Hexxeh/rpi-update
rpi-update
。您必须使用最新的固件和相关内核才能执行下一步。
安装并运行rpi-source
以安装构建您正在运行的最新内核的源代码。这将在/lib/modules
中为您正在运行的内核创建正确的条目。注意:您不需要root用户来运行它,但是脚本将使用sudo
执行某些任务,并且在脚本执行期间将请求root密码。
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!
答案 2 :(得分:9)
首先需要内核头文件(以及相应的内核二进制文件)来构建模块。
就像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
答案 3 :(得分:8)
这是一种痛苦。我不得不编译并安装内核模式驱动程序。经过长时间的搜索,我从here获得了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
答案 4 :(得分:0)
我正在使用完全相同的内核在我的RPI上处理完全相同的样本。我设法在我的RPI上编译模块但是当我发出insmod时我收到了一个错误。我按照XUbuntu虚拟机上的说明here(使用我的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
答案 5 :(得分:0)
我遇到了同样的问题,只需通过sudo apt-get install raspberrypi-kernel-headers
来解决