kernel 2.0.35用のデバイスドライバーの作成方法

'Linux Journal April 1998 Issue 48'に、Fernando Matiaさんが、 カーネルドライバーの作成方法について書いています。それを、参考 にして、より簡単なサンプルを、カーネル2.0.35用に作成しました。

footest_sample.C

ユーザープログラムです。0x318のデータを読み込み、0x318に、 0x32というデータを書き込みます。
foo_sample.c
デバイスドライバーの本体です。カーネルにリンクされます。
foo_sample.h
foo_sample.cにインクルードされるファイルです。
以下が作成手順です。


1)カーネルソースの展開
	#cp linux-2.0.35.tar.gz /usr/src
	#cd /usr/src
	#tar xvfz linux-2.0.35.tar.gz

2)foo_sample.c のコピー
	/usr/src/linux/drivers/charへコピーします。

3)foo_sample.h のコピー
	/usr/src/linux/include/linuxへコピーします。

4)リンク等の設定
	#cd /usr/src/linux
	#make menuconfig
	#make dep; make clean
	この操作によって、/usr/src/linux/include/asmなどのリンク
	が設定されます。

5)メジャーナンバーの設定
	/usr/src/linux/include/linux/major.h に、
	#define FOO_SAMPLE_MAJOR       62
		を加えます。

6)デバイスの作成
	#mknod -m og+rw /dev/foo_sample c 62 0

7)/usr/src/linux/drivers/char/mem.c の編集
	下記の3行を加えます。

	#ifdef CONFIG_FOO_SAMPLE
		foo_sample_init();
	#endif

8)/usr/src/linux/drivers/char/Config.in の編集
	下記の1行を加えます。

	bool 'sample device driver Apr/03/98' CONFIG_FOO_SAMPLE

9)/usr/src/linux/drivers/char/Makefile の編集
	下記の3行を加えます。

	ifeq ($(CONFIG_FOO_SAMPLE),y)
		L_OBJS += foo_sample.o
	endif


10)テストコンパイル
	#cd /usr/src/linux/drivers/char
	#gcc -c foo_sample.c -Wall -D__KERNEL__

	エラーも警告も出ないことを確認します。

	foo_sample.o を除去します。
	#rm -f foo_sample.o

11)カーネルの再コンパイル
	#cd /usr/src/linux
	#make menuconfig
		ここで、character devices ---> の項目で、
		[*] sample device driver Apr/03/98
		と設定します。
	#make dep; make clean
	#make zlilo
	#make modules
	#make modules_install
	必要に応じて、/etc/lilo.confの編集後、
	#/sbin/lilo

12)リブート

13)dmesg | more とやって、
	FOO_SAMPLE CHECK AAA *** Apr/06/98 *** P.M. 15:52 ***
	FOO_SAMPLE CHECK BBB.
	FOO_SAMPLE CHECK CCC.
		|
		|
		|
	FOO_SAMPLE: driver initialized with major 62

	というメッセージが出ていることを確認して下さい。

14)サンプルプログラム(footest_sample.C)のコンパイル
	$c++ -o footest_sample footest_sample.o

15)サンプルプログラムの実行
	$ footest_sample
	*** footest_sample *** Apr/06/98 PM 15:45 ***
	check bbb
	In_data = 8d
	check ddd
	*** footest_sample  *** End ***

私のホームページへ

1998年7月28日改訂