web-dev-qa-db-ja.com

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ソースもインストールしました

Sudo apt-get install linux-source

これをコンパイルするために私ができることについてのアイデアはありますか?

24
user3025582

Raspbianで Hello Worldカーネルモジュール を構築するために使用した手順を次に示します。

  1. Sudo rpi-updateを実行します

    rpi-updateの詳細については、 https://github.com/Hexxeh/rpi-update を参照してください。次のステップを実行するには、最新のファームウェアおよび関連するカーネルを使用している必要があります。

  2. rpi-sourceをインストールして実行し、実行している最新のカーネルをビルドしたソースコードをインストールします。これにより、実行中のカーネルの/lib/modulesに正しいエントリが作成されます。注:これを実行するためにルートである必要はありませんが、スクリプトはSudoを使用して特定のタスクを実行し、スクリプトの実行中にルートパスワードが要求されます。

    rpi-sourceのインストール手順は、 https://github.com/notro/rpi-source/wiki にあります。

これらの手順が実行されると、Hello Worldカーネルモジュールをmakeできるようになります。

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!
13
HeatfanJohn

モジュールをコンパイルするとき、-Cパラメーターは、カーネルが構築されたソースツリーを指す必要があります(クリーンアップしないでください!)。 piでビルドした場合、ホームディレクトリの下のディレクトリにある可能性があります。

/lib/modules/<version>の下のbuildディレクトリはDebian主義であり、ソースツリーの縮小版にはモジュールをビルドするのに十分なコンテキストが提供されます。 Raspberry Pi Foundationカーネルのカーネルには、buildディレクトリが付属していません。

少し古いかもしれませんが、raspbianはカーネルをDebianスタイルのパッケージとして提供します。これには、カーネルモジュールのビルドに使用できるbuildディレクトリが含まれている必要があります。

Sudo aptitude install linux-image-rpi-rpfv linux-headers-rpi-rpfv
13
Greg

モジュールを構築するには、最初にカーネルヘッダー(および対応するカーネルバイナリ)が必要です。
Gregが言ったように、raspbianディストリビューションはパッケージを提供します:

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

次に、新しくインストールしたカーネル(私にとっては3.10-3-rpi)を起動するようにraspbianに指示します。
/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
9
JayDee

これは苦痛でした。カーネルモードドライバーをコンパイルしてインストールする必要がありました。長時間検索した後、pi 2(3.18.7-v7 +)のヘッダーを here から取得しました。

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
8
Ryu_hayabusa

まったく同じカーネルを使用して、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
0
cstick

私は同じ問題に遭遇し、Sudo apt-get install raspberrypi-kernel-headers

0
Michael Hou