OS: Fedora 17
kernel: 3.5.3
カーネルモジュールのソースコード
hello_world_kmod.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int hello_init(void)
{
printk(KERN_ALERT "hello_init\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "hello_exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anti-Social");
MODULE_DESCRIPTION("A Hello, World Module");
hello_world_kmod.cと同じフォルダに以下のMakefileを置きます。
Makefile
KERNEL_DIR := /home/user/linux-3.5.3/
obj-m := hello_world_kmod.o
driver: hello_world_kmod.c
make -C $(KERNEL_DIR) SUBDIRS=`pwd` modules
1行目のカーネルディレクトリの指定では、今使用しているカーネルのソースのディレクトリを指定してください。
そこにあるMakefileを利用してカーネルモジュールをビルドします。
私は自分でコンパイルしたカーネルを使っているのでホームディレクトリに置いてあるカーネルのソースのディレクトリを指定しています。
OSのデフォルトのカーネルを使用している場合は
# yum install kernel-devel
などで必要なファイルをインストールし、
インストールされたディレクトリを指定すればいけるのではないでしょうか。
6行目の頭はスペースではなくてタブなので気をつけてください。
スペースにするとエラーになると思います。
Makefileを作成したらmakeしてください。
hello_world_kmod.koができるはずです。
同ディレクトリにて
$ modinfo ./hello_world_kmod.ko
で、作成したカーネルモジュールの情報を確認できます。
# insmod ./hello_world_kmod.ko
で作成したカーネルモジュールをロードできます。
$ lsmod | grep hello_world_kmod
などでロードできたことを確認してください。
カーネルモジュールのソース中でprintkした文字列は、
/var/log/messages
を参照すれば出力されていることを確認できるはずです。
モジュールのアンロードは
# rmmod hello_world_kmod
です。