Parallels上Ubuntuでデバイスドライバプログラミングする環境と手順
Linuxのデバドラ周りに興味があったので、Linux環境を構築すべく、ParallelsにUbuntu入れた。そのときのつまずきメモおよびモジュールの作成手順。環境は、Mac OS X 10.4.11、Ubuntu7.10、Parallels3.0。
Ubuntuインストール
基本的には
http://hdotunclipped.blog99.fc2.com/blog-entry-141.html
を参考にして進めていく。
Ubuntuを起動するときに、
The display server has been shut down about 6 times in the last
90 seconds. It is likely that something bad is going on.
Waiting for 2 minutes before trying aain on display:0.
と、Xの問題に直面した。
Knowledge Base
を参考にGrubの設定をいじる。これで無事起動した。
ネットワークも難なくホストと共有できている。この点は、Ubuntuのいろんなバージョンを試してみたんだけど、7.10が一番スムーズだった。
で、標準ではEmacsとか入ってないのでインストール。パッケージを最新の状態にすべくaptを更新するんだけど、ここで
いくつかのアーカイブが取得できません。apt-get updateを実行するか --fix-missing オプションを付けて試してみてください。
前にLinuxインストールしたときにも同じ現象に引っかかった記憶がある。学習してないなあ。
Ubuntu 7.10 インストール個人的ノート
% sudo gedit /etc/apt/sources.list
により、gedit で設定ファイル /etc/apt/sources.list を編集。
# deb ...
# deb-src ...
で始まる行のコメントアウトをはずして保存する。% sudo apt-get update
% sudo apt-get upgradeとする。
Emacsで「C-m」が認識されないとか、デフォルトで「C-h」が単語削除キーに割り当てられていたり、という微妙な感じだけど、ひとまず我慢する。これで一通りの設定は完了した。
デバイスドライバプログラミング
デバドラのプログラムは、モジュールとしてカーネルに組み込まれる。ここでmodule.hが必要なんだけど、バージョンによって標準で入ってたり入ってなかったり。今回カーネルのバージョンは2.6.22-14で、入ってた。2.6.10とかだと入ってなかった記憶があって、適宜カーネルソースから引っ張ってくる必要がある。
以下単純なモジュール hello.c
参考:Linuxカーネル徹底理解 (日経BPパソコンベストムック)
#include <linux/module.h> #include <linux/kernel.h> static int hello(void){ printk(KERN_INFO "hello daisukebe!!\n"); return 0; } static void exit(void){ printk(KERN_INFO "goodbye daisukebe\n"); } module_init(hello); module_exit(exit);
makefileはこんな感じ
obj-m := hello.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default $(MAKE) -C $(KDIR) SUBDIR=$(PWD) modules
モジュールプログラミングはrootで行う。コンパイル。
# su
# make
モジュールの組み込み、削除は以下
# insmod hello.ko
# rmmod hello
ログを動的に追うには、別端末で
tail -f /var/log/messages
てtailを走らせておけば、indmodやrmmodするたびにprintkの文字列が出力される。
以上、Macの上のParallelsの上でUbuntuを動かして、デバイスドライバプログラミングを始める手順はこんな感じで、意外と簡単。
とはいえ、ここからまともなデバイスドライバを書こうとすると難易度が増して、なかなか進まないんだけど。30日自作OSの方をPendingしてるので、一旦そちらに戻ろうと思う。
後になって再度読むと、すんなり入ってくる、というのが、自分にはよくあることだし。