ドライバをつくる前段階として、ドライバを組み込むための方法であるモジュールについて述べ、その作り方と簡単な例を示します。
【カーネル(Kernel)】
アプリケーションからハードウェアを容易に操作したり、また、ハードウェアの資源管理やアプリケーションのプロセスを管理・制御していたりするものです。
【モジュール(Module)】
要求に応じてカーネルに取り外しや交換を簡単にできる部品やプログラムのことです。
【カーネルモジュール(Kernel Module)】
カーネルの機能の一部を部品として取り出した (モジュール 化した)もので、必要に応じてメモリへのロード/アンロード が自由に行えます。
Linux ではデバイスドライバはモジュールとして用意されています。従来は必須だったカーネルの再構築をすることなく、モジュールの組み込みだけで各種デバイスを使えるようにできます。
カーネル2.6では、ローダブルモジュールのアーキテクチャが変わるとともに、拡張子が'*.ko'となり、モジュールの作成方法もこれまでから変更になりました。
#include <linux/module.h> // required by all modules #include <linux/kernel.h> // required by printk() #include <linux/init.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Zoe"); // Start/Init function static int hello_init(void) { printk(KERN_ALERT "Hello world!\n"); return 0; } // End/Cleanup function static void hello_exit(void) { printk(KERN_ALERT "Goodbye world!\n"); } module_init(hello_init); module_exit(hello_exit);
printkはprintfと同じような感覚でカーネル内で使用可能な関数です。
新しいモジュールアーキテクチャのカーネル2.6でローダブルモジュールをコンパイルするためのMakefileサンプルです。
obj-m := hello.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
ファイルを作成したら make しましょう。
make -C /lib/modules/`uname -r`/build SUBDIRS=(ファイルのある場所) modules
次に、root になりモジュールを組み込みます。
% su % /sbin/insmod hello.ko
モジュールが組み込まれたことを確認しましょう。
% tail -1 /var/log/messages Aug 11 23:32:02 localhost kernel: Hello world!
モジュールの除去は次のコマンドで行います。
% /sbin/rmmod hello.ko
モジュールが除去されたことを確認しましょう。
% tail -1 /var/log/messages Aug 11 23:33:54 localhost kernel: Goodbye world!
※ /etc/syslog.conf に設定されていないと/var/log/messages では表示されません。 nice --20 tail -f /proc/kmsg などで確認しましょう。
まず、Linuxのカーネルバージョンを知るにはプロンプト上でunameコマンドを利用して下さい。
% uname -r 2.6.5-1.358
このときバージョンが「2.4.x」の方は、以下のコンパイルコマンドで .o ファイルを作ることでモジュールを生成できます。
gcc -D__KERNEL__ -DMODULE -I/usr/src/linux-2.4/include -O2 -c hello.c