(注意)このブログは
本家のほうの文章部分のみの転載です.ソースコードの配布,画像などについては本家のほうを参照してください.文章中のリンク先は面倒なのですべて本家のほうに変換してしまっているのでご注意ください.
ちょっといまさらなのだけど,
CQ出版の
「Interface」の2009/02号から「実践的PowerPC活用テクニック」という連載を書いていて,第12回の
2009/07号で,KOZOSが紹介されています.5月末の発売なので,ホントいまさらですな.(読みたい人はバックナンバーを買って!買うときには「KOZOSの記事が読みたくて」と出版社に言ってね!)
内容は,BLANCAのPowerPCオプションボードにKOZOSを移植する,というものです.ついでに次の号では,KOZOSをベースにGDBスタブ移植してGDB対応しています.
KOZOSのソースコードは雑誌掲載用に必要最低限の内容にしぼってあります.で,連載のサンプルプログラムをダウンロードできるようにするのをすっかりさぼっていたのだけど,
ここからダウンロードできるようにしときました.興味ある人は見てみてください.KOZOSの移植のソースコードは,「第12回(2009/07号)のサンプルプログラム」というやつです.あと第13回のほうでもGDBスタブ実装のためにKOZOSを利用しているので,そっちも参考になるかも.
ちなみに上記ソースコードなのだけど,連載の以前の回のファイルもそのまま残ってしまっているので,ちょっといろいろあります.が,pci.[ch]やled.[ch]などはKOZOSの動作にはとくに無くてもいいもので,KOZOSのコア部分だけに関してならばだいたい700行くらいです.
% ls
KL-01 crti.c led.c memory.c startup.s
LICENSE crtn.c led.h memory.h syscall.c
Makefile extintr.c lib.c pci.c syscall.h
command.c idle.c lib.h pci.h thread.c
configure.h kozos.h main.c serial.c thread.h
crt1.c ld.scr make.sh serial.h
% cat kozos.h memory.[ch] startup.s syscall.[ch] thread.[ch] | wc -l
698
%
で,ここで言いたいのは「KOZOSは小さくてすごいでしょ!」ということではなくて(小さいとは思うが,すごいとは思わないので...),「OSってたったのこれだけでも書けてしまうんです」ということです.まあこのへんのことは
こっちでいろいろ書いているのでそっちも読んでほしいのだけど,こんだけでいいなら,OSってもしかしたら自分でも作れちゃうんじゃないの?とかいう気になるでしょ?
どの程度の機能があればOSと呼べるのか? VGA無いのでは話にならん!ネットワーク機能も無いのでは実用にならん!ファイルシステムは必須だろう!といった意見は多々ある.しかし,それらって別にOSの機能ではないと思う(UNIXはファイルシステムOSなので,動作のためにファイルシステムが必須だが,それはUNIXがそうなだけであって,OS一般の話ではない).これはぼくの勝手な持論なのだけど,スレッド管理とメモリ管理とデバイス管理だけあればOSと呼べると思う.というのはコンピュータ・システムの3大要素がCPUとメモリとI/Oであるので,その3つを管理できれば,コンピュータ・システムを管理しているといっていいと思うからだ.
会社の若手とかがちょっと志を持って,個人的にOS勉強してみたいなーと思ったり,大学生やもしくは高校のパソコン部とかで,自分らで独自OS作ることはできないかと挑戦してみたくなったときに,サンプルとしてLinuxとかμiTRONとかを見てしまうと,巨大すぎてたいていはまあ己の無力さを感じるだけの結果となってしまうと思う.(それでも「作ってやるぜ!」と思うような人はこのページを見なくても勝手に作ると思うので,それはそれでいいですが)
しかしたとえば今回のKOZOSの移植例のように,たったの700行ていどなら「自分でも作れるのではないか?」「少なくとも,頑張ってソースコード読めば全貌を理解できるだろう」と思えるじゃあないですか.
そーいう意味でKOZOSはあまり機能追加してコード量を多くはしたくないし,将来的に
デバッグ機能とかを追加していくとしても,それは別コードとして独立させて,簡略化してあるソースコードはちゃんと残したいと思う.多CPU対応するときもそうで,本来ならハードウエアを仮想化して移植性を高くしてソースコード共通化する,という話になるのだけれど,KOZOSの場合はCPUごとにソースコードを独立させて,シンプルさを確保したいと思っている.
というのは「ハードウエアを仮想化してソースコード共通化する」というのはプログラムの書き方の勉強であって,OSの本質の勉強とはあまり関係の無いことであり,そっちはそっちで別に勉強すべきことだと思うからだ.
これに関しては反論多そうなので一応書いておくけど,「勉強しなくていい」という意味ではないよ.ただOSの勉強したいときに,OSの本来の動作(スレッド切替えとか,割り込み処理とか)の部分のソースコードが難しくてわかりにくいというのはしょうがない.それはOSを知るためにはそれを理解することが必要,ということだからだ.しかしソースコード共通化などの別原因で(#defineの定義や関数呼び出しが深くなってしまい)ソースコードが追いにくくなっていて,本来やりたい「OSの内部構造の勉強」の妨げになるのはよくないと思う,という僕の考えだ.矛先が違うということだ.
で,そのようなあまり関係の無いことのために読みにくくなってしまい,「OSの内部構造を知りたい」という本来の目的から離れてしまうのは避けたい.もしもそのような書き方が必要なら,必要となった人が必要なときにそう書けばよいだけのことだ.
もちろん,700行程度でできることは少なくて,雑誌掲載用にシステムコールも必要最低限だけにしぼってある.だけどこれは「機能が貧弱なので実用的でない」ということではなく,「機能は最低限しか無いので,ほしいサービスがあればシステムコールを自分で追加してみたらどうだろう」「そもそも機能が貧弱すぎてKOZOSはダメだと思うならば,自分でスクラッチで書いてみてはどうでしょう」という僕のメッセージだと受け取ってほしい.
KOZOSでのシステムコールの追加は簡単だ.syscall.[ch]にシステムコールの入口があるのでそこにてきとうに追加して,実際の処理を thread.c に書くだけだ.セマフォとかほしければ,簡単に実装できると思う.改造しやすい,機能追加しやすいということは,KOZOSの最大の魅力のひとつだと思う(中身をたいして読まなくても,誰でも改造できます).いろいろお試しで機能を入れてみて実験するためのベースOSにするというのはとてもいい使いかただと思う.なにせ僕自身が,たとえばGDBスタブ実装の実験とか,GDBスタブのスレッド対応の実験とかのベースOSとして使っているので.
組み込みOSの勉強をしたいとき,いちばん手っ取り早いのは,何かてきとうなOSを拾ってきて動かしてみることだ.で,いろいろ実験してみるのがいいのだけど,その実験用にまあその拾ってきたOSを使ってもいいが,実験用のベースOSとして自作OSをひとつ持っておくと,いろいろと試すときにとても便利だ.
「KOZOSなんて貧弱だしダメだよ」と思ってもらっても構わないが,そのような人は自分で作ればいいだけのことだ.僕はべつに,KOZOSを実用OSとしてそのまま使ってほしいというわけではない.ただ「OS自作は難しい」というイメージを払拭し,OS自作のハードル(技術的なハードルというより,「難しそう」という意識的なハードル)を下げたいだけだ.
自分自身,個人的興味だけで組み込みOSを勉強したいと思ったが教えてくれる人はいなくて,独学でいろいろやってきたが,読解しやすくて試しやすいサンプルが無いことが一番のハードルではあった.
自分のそーいう経験が,ほかの似たような人のために役立てられればいいなあ,と思う.だからKOZOSは,OSの専門知識を持っている人や大学できちんと教わることができた人やμiTRONの勉強をきちんとした人だけが理解できるというものではなく,OSを何も知らない人でも,一生懸命読めば理解できるし簡単に試せる,というものにしたい.