カーネルモジュール

Linuxカーネルモジュールの作成、インストール方法
※参考「Linuxデバイスドライバ 第3版」

カーネルモジュールの作成、インストール方法


Cソース(hello.c)

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
  printk(KERN_ALERT "Hello World\n");
  return 0;
}

static void hello_exit(void)
{
  printk(KERN_ALERT "Good Bye\n");
}

module_init(hello_init);
module_exit(hello_exit);

初期化、終了時にそれぞれ実行される
hello_init(), hello_exit()関数でprintkを実行している。
printkの出力は/var/log/messagesに吐き出される。

Makefile

obj-m := hello.o

メイクの仕組みはよく理解していない。
カーネルビルドの環境を利用しているらしい。
一旦カーネルビルド環境に入り、ターゲットのディレクトリに戻って処理をするらしい。なので(カーネルの環境を利用するので)このような見慣れない記述でビルドが出来るらしい。

シェルから以下のように入力
※ここで/usr/src/kernels/linux-3.6.6はカーネルソースのある
 ディレクトリを指す。

$ make -C /usr/src/kernels/linux-3.6.6 M=`pwd` modules

$insmod hello.ko

にてカーネルにロードされる。
また、削除は

$rmmod hello.ko

と打つ。
/var/log/messagesにHello WorldおよびGood Byeと表示されていれば
このカーネルモジュールがロード、アンロードされたことがわかる。