目的
Linuxカーネルモジュールのプログラミングはユーザー空間のアプリケーションプログラミングとはかなり異なります。まずは定番の”Hello World”で簡単なプログラミングを経験してみましょう。
準備
基本的なプログラミング環境は準備できている、つまりgccなどはインストールされている前提です。カーネルモジュールのプログラミングのためにまず、カーネルヘッダーをインストールします。
$ sudo apt install linux-headers-$(uname -r)
プログラミング
今回示す例はローダブルカーネルモジュールです。作成したカーネルモジュールをinsmodコマンドでロード、rmmodでアンロードします。ロード時に実行される関数で”Hello World!”、アンロード時に実行される関数で”Goodby World.”の文字列をカーネルメッセージに出力します。
#include <linux/module.h>
#include <linux/init.h>
MODULE_AUTHOR("hoge");
MODULE_DESCRIPTION("Hello World Module");
MODULE_LICENSE("MIT");
static int __init helloworld_init(void)
{
pr_info("Hello World!\n");
return 0;
}
static void __exit helloworld_exit(void)
{
pr_info("Goodby World.\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);
ビルド
Makefileを作成してmakeします。
obj-m := helloworld_km.o
clean-files := *.o *.ko *.mod.[co] *~
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
$ make
動作確認
以下の手順で実行してカーネルメッセージ出力を確認してみましょう。
作成したカーネルモジュールをロードします。
$ sudo insmod helloworld_km.ko
念のためロードされたか確認します。
$ lsmod | grep helloworld_km helloworld_km 16384 0
カーネルメッセージを確認します。
$ dmesg ※中略 [ 9308.697233] Hello World!
カーネルモジュールをアンロードします。
$ sudo rmmod helloworld_km
カーネルメッセージを確認します。
$ dmesg ※中略 [ 9311.895783] Goodby World.
コメント