[英]How to compile a kernel module for Raspberry pi?
我在為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安裝了linux源代碼
sudo apt-get install linux-source
關於我可以做些什么來進行編譯的任何想法?
編譯模塊時, -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密碼。
有關安裝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!
首先需要內核頭文件(以及相應的內核二進制文件)來構建模塊。
就像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
我遇到了同樣的問題,只需通過sudo apt-get install raspberrypi-kernel-headers
修復它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.