Loadable Kernel Moduleの作り方
Rev.3を表示中。最新版はこちら。
LinuxのLoadable Kernel Moduleの作り方のHowTo。対象はバージョンは2.6。
1. SourceとMakefile
カーネルにLoad/Unloadできるだけの小モジュールを作ってみる。何処か適当なディレクトリに以下のようにソースとMakefileを作る。
xxxxxx/
Makefile - Makefile
small.c - モジュールのソース
1.1 Source
モジュールのソースコードのサンプルを以下に示す。
最低限必要なのは、モジュールがLoadされた時に呼び出される初期化ルーチン(smallmod_init_module())とモジュールがUnloadされる時に呼び出される後処理用ルーチン(smallmod_init_module())。これらのルーチンは、それぞれmodule_init(),module_exit()マクロで指定する。
初期化ルーチンの返り値はint型で、正常に処理が終了した場合は0を返す。
インクルードファイルはmodule_init,exit()用にmodule.hが必要。あと、カーネルのconfigが必要な場合はconfig.hをインクルードする。以下ではprintk()でメッセージを出力しているのでkernel.hもインクルードしている。
MODULE_DESCRIPTION,MODULE_AUTHOR,MODULE_LICENSEもちゃんと書いておくとよい。これらの情報はモジュール(*.ko)の.modinfoセクションに書き込まれる。
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_DESCRIPTION("Small Test Module");
MODULE_AUTHOR("kztomita");
MODULE_LICENSE("GPL");
/* Moduleがロードされた時に呼び出される初期化ルーチン */
static int smallmod_init_module(void)
{
int error = 0;
/*
* 初期化処理を行なう
*/
printk("smallmod is loaded.\n");
/* エラーの場合 */
if (error)
return -ENODEV;
return 0;
}
/* Moduleがアンロードされたる時に呼び出される後処理 */
static void smallmod_cleanup_module(void)
{
printk("smallmod is unloaded.\n");
}
module_init(smallmod_init_module);
module_exit(smallmod_cleanup_module);
1.2 Makefile
Makefileのサンプルを以下に示す。このMakefileはsmall.cをコンパイルしてモジュールsmallmod.koを作成する。コンパイルは本Makefile単体では行なえず、カーネルソースツリーにあるMakefileを呼び出してカーネルモジュールコンパイルのルールを利用する。
KERNELSRCDIR = /usr/src/linux
BUILD_DIR := $(shell pwd)
VERBOSE = 0
# モジュール名
obj-m := smallmod.o
# <モジュール名>-objs にモジュールを構成するオブジェクトの一覧を列挙する
smallmod-objs := small.o
all:
make -C $(KERNELSRCDIR) SUBDIRS=$(BUILD_DIR) KBUILD_VERBOSE=$(VERBOSE) modules
clean:
rm -f *.o
rm -f *.ko
rm -f *.mod.c
rm -f *~
2. コンパイル
3. Load/Unload
3.1 Load
モジュールをLoadする。(root権限で行なうこと)
/sbin/insmod smallmod.kolsmodでモジュールがLoadされていることを確認できる。
# /sbin/lsmod
Module Size Used by
smallmod 2176 0
ppp_deflate 5760 0
zlib_deflate 22552 1 ppp_deflate
<略>
dmesgでモジュールの初期化ルーチンのprintk()のメッセージが出力されているのが確認できる。
# dmesg
<略>
PPP generic driver version 2.4.2
PPP Deflate Compression module registered
smallmod is loaded.
3.2 Unload
モジュールのUnload。/sbin/rmmod smallmodモジュールが消えているのが確認できる。
# /sbin/lsmod Module Size Used by ppp_deflate 5760 0 zlib_deflate 22552 1 ppp_deflatedmesgで後処理ルーチンのメッセージが出力されているのが確認できる。
#dmesg
<略>
PPP generic driver version 2.4.2
PPP Deflate Compression module registered
smallmod is loaded.
smallmod is unloaded.
