簡體   English   中英

如何為Raspberry pi編譯內核模塊?

[英]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內核模塊的步驟。

  1. 執行sudo rpi-update

    有關rpi-update詳細信息,請參閱https://github.com/Hexxeh/rpi-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!

首先需要內核頭文件(以及相應的內核二進制文件)來構建模塊。
就像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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM