Raspberry Piのカーネルドライバ(モジュール)をWSL上でクロスコンパイル

さていよいよ今回のプロジェクトの本題、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)を出力すれば、ログで確認できる。