さていよいよ今回のプロジェクトの本題、Raspbery Piをターゲットにしたlinuxのカーネルドライバ(モジュール)の作成だ。
まずは安全牌でRaspbery Piでビルドしてみよう。
そう、私のRaspbery PiのカーネルはWSL上でクロスコンパイルした代物。
どうやら一筋縄ではいかないらしい。
どうせやるつもりだったので、いきなりWSL上でクロスコンパイルすることにした。
手順は
だ。
すでにWSL上でカーネルビルドをして、RaspberryPi用のソースコード・ツールチェーンが入っている前提で進める。
まだな方はこちらから。
ソースコード、ファイル名は"test.c"となっている。
#include <linux/module.h> static int test_init(void) { printk("Hello Aho Kernel Module\n"); return 0; } static void test_exit(void) { printk("Bye bye Aho Kernel Module\n"); } module_init(test_init); module_exit(test_exit); MODULE_LICENSE("GPL");
Makefileはこんな感じ。
obj-m := test.o KPATH := $(HOME)/source/git/linux CROSS_COMPILE := arm-linux-gnueabihf- ARCH := arm all: make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KPATH) M=$(shell pwd) modules clean: make -C $(KPATH) M=$(PWD) clean
筆者は以前にカーネルのビルドをしているので、そのディレクトリをビルド環境に指定(-C)している。
それがKPATHの" $(HOME)/source/git/linux"だ。
- make
makeしろぷりーず。
無事に終われば、test.koができているはず。
- デプロイ
Raspberry Piにtest.koをコピーして
sudo insmod test.ko
でドライバのロードが完了。
ドライバをカーネルからアンロードするには
sudo rmmod test.ko
上記のtest.cはロード時とアンロード時にカーネルメッセージを出力するだけの"Hello World"的なドライバなので、カーネルメッセージ(dmseg)を出力すれば、ログで確認できる。