カーネルモジュールを作ってみよう 1
Linuxカーネルのカーネルモジュールの作り方を説明します
概要
Linuxカーネルのローダブルカーネルモジュールの作成方法を説明します.
モジュールのプログラムはカーネル空間で動作します.
ローダブルカーネルモジュールとは
Linuxカーネルにはローダブルカーネルモジュールという仕組みがあります.
カーネルのある機能を,カーネルプログラムのファイルの中には含めずに,モジュールという別ファイルとして保存しておき,
OS(カーネル)の起動後に,そのファイル(機能)をロードしたり,アンロードしたりすることができます.
モジュールファイルは,/lib/modules/<カーネル名>/kernel/ の下にあり,*.ko という名前をしています.(かつては *.o でした)
モジュールプログラムはカーネル空間で動作します.
モジュールのロードは insmod コマンドで,アンロードは rmmod コマンドで行います.
現在ロードされているモジュール一覧は lsmod コマンドで確認できます.
最初のモジュール (hello)
ロード(insmod)をすると,
printk(KERN_INFO "Hello,World!\n");
を実行し,アンロード(rmmod)すると
printk(KERN_INFO "Good-bye,World!\n");
を実行するモジュールプログラムを作ります.
プログラム
hello.c
#include <linux/module.h>
static int __init hello_init(void) {
printk(KERN_INFO "Hello,World!\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_INFO "Good-bye,World!\n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
obj-m := hello.o
コンパイル方法
コンパイルスト,hello.ko というファイルができあがります.
実行方法 (ロード,アンロード方法)
太字がユーザ入力
ロード(insmod)をすると,
printk(KERN_INFO "Hello,World!\n");
が実行されます.
printkの出力内容は,dmesgコマンドで確認できます.
ロードしたあとは,lsmodで表示される一覧の中に hello が含まれます.
アンロードは,rmmod hello で,rmmod hello.ko ではありません.
実行環境
OS: Ubuntu 20.04.4 Server
おまけ
コンパイルをもう少し楽にするには.
Makefile
obj-m := hello.o
all :
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
コンパイル方法
make