What is it, naokirin?

Linux デバイスドライバの開発 (1)

今度から自分がまとめたいとかそういう理由でゼミでやった内容をブログで書いていこうと思う。


それはさておき、Linux デバイスドライバ

そういえばこれは「なぜ始めたのか」が分からない・・・
なんで始めようと思ったのかは本当に定かでないが、一つ言えることは「なんかハードに近いところを触ってみたいし、デバイスドライバとかいいかなあ」くらいの感じだったのだろうと思う。


今回は概要を書き下しておくことにしたい。



まず、必要環境。

Linux カーネル (言うまでもなく)
カーネルと同じバージョンのkernel-develとkernel-headersのパッケージ


あとはドライバのプログラムを書いて、ドライバをビルドし、カーネルにロードすればいい。

今回はドライバのプログラムの書き方は後にして、ビルドの方法とカーネルへのロード/アンロードについてを書いておく。

Linux 2.4までは「gcc -c」でコンパイルして「.o」ファイルを作ればよかったらしい。
ただLinux 2.6からは「.ko」というファイルを作成する必要があるようだ。

そのファイルの作成方法はMakefileを使うものらしい。
実際には下のようにすればよい。

obj-m:="ファイル名.o"

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

これによって、「ファイル名.ko」ファイルが作成できる。
make」を実行してビルド。

失敗するときは「export LANG=C」でロケールを日本語から英語にする。

また、「make clean」とすることで、クリーンアップをすることができる。これは便利!(というよりないと困る!)

ここまでで(クリーンアップを実行していなければ)「.ko」を含むファイル群ができているはずなので、「/sbin/insmod」コマンドでドライバをロードします。

ちゃんと動いた場合は「/sbin/lsmod」コマンドで現在ロードされているカーネルモジュールの一覧を見ることができるので、ロードされているか確認します。

またアンロードしたい場合は「/sbin/rmmod」コマンドを使うことで行えます。


次はカーネルコンフィグレーションへの追加と静的なデバイスドライバの作成について。