Linux Kernel 2.6.x プログラミングガイド

ドライバをつくる前段階として、ドライバを組み込むための方法であるモジュールについて述べ、その作り方と簡単な例を示します。


Kernel Module とは

【カーネル(Kernel)】
アプリケーションからハードウェアを容易に操作したり、また、ハードウェアの資源管理やアプリケーションのプロセスを管理・制御していたりするものです。

【モジュール(Module)】
要求に応じてカーネルに取り外しや交換を簡単にできる部品やプログラムのことです。

【カーネルモジュール(Kernel Module)】
カーネルの機能の一部を部品として取り出した (モジュール 化した)もので、必要に応じてメモリへのロード/アンロード が自由に行えます。

Linux ではデバイスドライバはモジュールとして用意されています。従来は必須だったカーネルの再構築をすることなく、モジュールの組み込みだけで各種デバイスを使えるようにできます。

Kernel Module の例 (kernel 2.6用)

カーネル2.6では、ローダブルモジュールのアーキテクチャが変わるとともに、拡張子が'*.ko'となり、モジュールの作成方法もこれまでから変更になりました。

ファイル名:hello.c
#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と同じような感覚でカーネル内で使用可能な関数です。

Kernel Module のコンパイル

新しいモジュールアーキテクチャのカーネル2.6でローダブルモジュールをコンパイルするためのMakefileサンプルです。

ファイル名: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 などで確認しましょう。

Kernel Module のコンパイル (kernel 2.4用)

まず、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 

Valid XHTML 1.1! Valid CSS! 初版更新日 2006/08/12   最新更新日 2009/06/29