【Raspberry Pi 3 Model B】カーネルモジュール版のHello worldを作成してみる

目的

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.

コメント

タイトルとURLをコピーしました