Linux実機が手元になかったので(実際にデバイスを制御しない)デバイスドライバ作成のための環境構築をUbuntu20.04 on WSL2上で行った。
-
システムのカーネルのバージョンの確認する。
$ uname -r
4.19.104-microsoft-standard
2. Githubの[microsoft/WSL2-Linux-Kernel](https://github.com/microsoft/WSL2-Linux-Kernel)から対応するバージョンのカーネルのソースコードを落とす。
```
$ wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/$(uname -r).zip
$ unzip $(uname -r).zip
-
README-Microsoft.WSL2
に従ってカーネルをビルドする。並列コンパイルのためmake -j
にしたらメモリが足らなくなったので注意。
$ sudo install build-essential flex bison libssl-dev libelf-dev
$ cd path/to/WSL2-Linux-Kernel-$(shell uname -r)
$ make KCONFIG_CONFIG=Microsoft/config-ws
4. 試しにinsmod/rmmod時にログに出力するだけの簡単なデバイスドライバを作ってみる。デフォルトのログレベルが1 (KERN_ALERT)だったのでここでは0 (KERN_EMERG)でメッセージを出力した。
```hello.c
#include <linux/module.h>
static int hello_init(void) {
printk(KERN_EMERG "hello init\n");
return 0;
}
static void hello_exit(void) {
printk(KERN_EMERG "hello exit\n");
}
module_init(hello_init);
module_exit(hello_exit)
Makefile
obj-m := hello.o
all:
make -C path/to/WSL2-Linux-Kernel-$(shell uname -r) M=$(PWD) modules
clean:
make -C path/to/WSL2-Linux-Kernel-$(shell uname -r) M=$(PWD) clean
$ make
$ sudo insmod hello.ko
$ sudo rmmod hello
$ dmesg | tail
...
[ 1313.975997] hello init
[ 1320.991808] hello exit