最近また、C言語を勉強し始めた。
確かに、まだポインタを自由自在に扱えないが・・何とかプログラムは組める。
そこで、もう入門書に書かれてる、ジャンケンゲームや、占いゲームを作っても為になりません。
本当に、誰だって作れます。
だから、レベルを高くしてみました。
Linuxデバイスドライバ、プログラムをやってみる!
これが、またヤッカイなプログラミングやわ!
まず、Cの標準ライブラリの助けがない!
おいおいおい、今まで読んだC入門書がやくにたたない!(汗
カーネルの独自の関数などがあるみたい!
例えば、
printk が printfと似た動きをしてくれます。*浮動小数には対応してないけど
さて、今日は Hello World モジュールでも作ってみるか!?
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 ”Goodbye, cruel world\n”);
}
module_init(hello_init);
module_exit(hello_exit);
そして、Makefile の作成。*いまいちMakefileの作成が分からないため。http://www.geocities.co.jp/SiliconValley/1319/lkmpg/から参考にして作ったのだ!
Makefile
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
.PHONY: modules modules_install clean
else
obj-m := hello.o
endif
Makefileのインデントは全部Tabでやらないとエラーが出ます!
ここまで、準備ができれば両方同じディレクトリに保存して。
コンソールから
$ sudo make
$ sudo insmod ./hello.ko
削除の場合はこれ、
$ sudo rmmod hello
動作を確認してみる!
まず、モジュールを登録した時に (insmod ./hello.ko) カーネルが hello_init() メソットを
呼び出しますので、/var/log/syslog (もしくは、/usr/log/messages)
Oct 17 03:45:29 johna-desktop kernel: [ 9789.446880] Hello, world
sudo rmmod helloをやった際には、カーネルがhello_exit()を呼ぶので、
/var/log/syslog (もしくは、/usr/log/messages)にログが記録される。
Oct 17 03:49:18 johna-desktop kernel: [10018.457177] Goodbye, cruel world
実際に、(insmod ./hello.ko) をやった際に、ちゃんとモジュールが存在するか確認するには lsmod コマンドを
使えば確認ができる。
$ lsmod
Module Size Used by
hello 9600 0
nls_iso8859_1 13440 1
nls_cp437 15104 1
vfat 21120 1
//以下省略
これで、デバイスドライバ作成の道が開かれた!
まだ、始まったばっかりだけど。
ゴールにタドリつくのだろうか????
ほな、さよなら!
*注意
printk 関数を使うときに間違えるな・・・
printk(KERN_ALERT “Hello, world\n”); //デスよ!!!
printk(KERN_ALERT “Hello, word\n”); //ではありません。
あっ、恥ずかしい!昔別の言語で”Hello, word“書いた事あるぅぅぅ!