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
これをコンパイルするために私ができることについてのアイデアはありますか?
Raspbianで Hello Worldカーネルモジュール を構築するために使用した手順を次に示します。
Sudo rpi-update
を実行します
rpi-update
の詳細については、 https://github.com/Hexxeh/rpi-update を参照してください。次のステップを実行するには、最新のファームウェアおよび関連するカーネルを使用している必要があります。
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!
モジュールをコンパイルするとき、-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
モジュールを構築するには、最初にカーネルヘッダー(および対応するカーネルバイナリ)が必要です。
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
これは苦痛でした。カーネルモードドライバーをコンパイルしてインストールする必要がありました。長時間検索した後、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
まったく同じカーネルを使用して、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
私は同じ問題に遭遇し、Sudo apt-get install raspberrypi-kernel-headers