OSってどうやって作るんですか

 大学時代は研究でOSを作ったりしていました。
と言うと「どうやって作るんですか」「作れるものなんですか」と聞かれます。

 大学によっては授業でやったりもするらしいけれど、研究プロジェクトとしてやるというのは国内では珍しいらしい。10年くらい前の話なので今はどうかわからない。授業でやる人にとってはこの質問はどうなんでしょう。

「どうやって作るんですか」については、普通に仕様を決めてコードを書きます。大抵はCとアセンブラで書く事になるんじゃないかと思います。

 C言語は演習等で一通り学んでいたので同じ大学の人たちならまあ問題なかったんじゃないかと思います。私は演習課題は半分くらいしかできてなかったけど、まあ基本はできてたっぽいのでなんとかなりました。

 仕様についてもオペレーティングシステムについては授業で習うし、コンセプトと必要そうな機能の一覧は基本設計と一緒に先生が作っていたので大きな問題はありませんでした。私がOSの単位を落としている事以外は問題ない。

 こうしてできる材料は一通り揃っていたので何の不思議もなくできあがりました。

 不思議は無かったんですが、やっぱりVer.1.0の完成には1年近くかかっているわけで、ここからは単にその1年間の思い出話。

 確か私が4年生の頃の年末頃、大学院での研究テーマをOS関係にしようという話を教授として、「それは面白そうですね」と言ったのでこのプロジェクトに参加することになった。酒の席での約束だったと思う。

 それで私と新4年生2人とあと別プロジェクトの院生1人の学生計4人とベテランの先生方で開発プロジェクトがスタートした。これが4月。

 基本設計以下の具体的な仕様と設計については、学生4人で先生方といっしょにああだこうだ言いつつ3~4ヶ月くらいかけて作った。インタフェースとデータ構造を決めた。
 当時OSについてはあまりわからないなりにも教科書を引っ張り出したり既存OSのソースコードを調べたりしながら、むしろお勉強の部分にかなり時間をかけていたと思う。

 ここまでできたらあとは実装するだけとなる。そこで「作れるものなんですか」という話。

 理屈の上では作るために必要な材料はすべて揃っているように見える。仕様もできたし勉強もした。
 でもこの時点ではソースコードは一行も無いし、経験も無い。材料が揃っている気はするものの足りないものがあるかどうかの判断をするだけの知識が無くて、正直言って自分に何ができるのかできないのかよくわからない。

 この時点で8月。Ver.1.0完成目標は卒論との関係もあって12月にした。8月はメンバー4人のうち2人は院試のため1ヶ月休み。私ともう一人の院生2人は尻を叩かれながら8月末までに開始処理と入出力関係の基礎に目処をつけようとする。8月の残りは夏休みにすることにしたら2人ともそれまでの苦戦が嘘みたいに1週間で片づいた記憶がある。

 この時点では、ブートローダからカーネルを読み込み、ビデオメモリに直書きで文字を表示し、無限ループで停止するだけ。とはいえスタックも使えるし仮想空間も1つは使える。つまりCでコードを書く準備は整っている。
 このあたりまでくるとさすがにいけそうな気がしてくる。

 あとは仕様通りにC言語で構造体を定義してアルゴリズムを実装するだけ。開始処理はアセンブラだったので、ポインタがどうとかいう段階を経ずにいつの間にかC言語は書けるようになっている。これでだいぶ楽になるはず。

 ところで開発メンバー4人の役割分担は
(1)開始処理とキーボードと画面
(2)割り込み・例外・タイマー等
(3)仮想記憶
(4)プログラムとスケジューラ
という感じで、これくらいあれば最低限OSらしく動くだろうという話になっている。私の担当は(2)で、やっぱりアセンブラじゃないか。いやいいんだけど。

 画面担当がputsを発明し、画面に気楽に文字を表示できるようになる。これの機能拡充でprintfが作られ、数値も表示できるようになる。生産性が倍増する。
 さらに画面送りが実装され、みんなで喜んでログを出しまくり、画面が流れる様子を眺める。ちょっと楽しくなる。

 割り込み・例外処理が実装され、ページフォルトハンドラ等にレジスタ値を表示して停止する処理等を入れられるようになる。いわゆるカーネルパニックを実装した。これでようやくstop or restartデバッグ(無限ループを仕込んで停止すれば少なくともその部分までは実行されていることがわかる。そうでなければどこかで間違えてCPUがリセットされて再起動がかかる。悲しい)から解放され、生産性が激増する。

 ハードウェア再起動やソフトウェア再起動やキーボード割り込み処理が実装され、誰かがCtrl+Alt+Deleteでリスタートする処理を書いて、生産性がちょっと上がる。テンションはだいぶ上がる。

 この時点で10月末。仮想記憶管理とプログラム管理・スケジューラはまだ影と形くらいしかない。「ほとんどCで書けるから4年生でもいけるよね~」みたいに言っていたが実装量は多いし動作確認も面倒くさい。このあたりから全員で仮想記憶とスケジューラ実装の手伝いをしはじめる。先生方を巻き込んでコードレビューしたりペアプロしたり。
 この頃が泣いた笑ったり一番激しい時期だった。泣いたのはメンバーの1人が彼女に振られたからとかで、そんなの知るかよというがなしではあるけどそうは言っていられない、士気の低下のおそろしさにおののく。

 11月末あたり、スケジューラ担当に「これユーザプロセスってどうやってprintf呼び出すんですか」と言われ、やべえカーネルコール作り忘れてたと焦る。この頃になるとだいぶ全体の仕組みがわかってきていたので、既存OSでの実装など調べもせずに慌てて勘で実装する。こういうやりとりをしたということは、この頃には最低限の仮想記憶やプログラムやスケジューラの機能はできていて、1つ目のユーザプロセスが動き始めていたのだと思われる。

 クリスマスイヴ、Ver.1.0リリース予定日、なんでクリスマスなんだというとみんな暇だったからだ。振られた奴もいるし。
 リリース予定日、というかもう打ち上げの店もとってるし遠方からゲストも呼んでるしリリースしないとどうしようもない。最悪残念会になる。でもまだバグがとれてない。複数のプロセスの起動停止を繰り返すと数十回目くらいでカーネルパニックが起きる。どうしてもこのバグが取れない。打ち上げの開始時刻になったあたりでようやく原因が見つかる。確かプロセス管理表のサイズの計算ミスだった。修正してデータまとめてCD作成などは得意な先生に任せて既にゲスト等が先行している打ち上げ会場に走る。会場を近所にしておいてよかった、偶然だけど。

 こうして無事に我々のOSのVer.1.0は完成しました。

 で、「作れるものなんですか」については、やってみれば案外できる。ということになります。材料があれば。
 打ち上げでの話題はまさに「案外できるもんでしょ」「本当ですね」という感じでした。

 いや、コマンドインタプリタもないしハードディスクも読めないしファイルシステムも無いし、当初の計画から削った部分はかなりあったんですが、研究の土台になる部分など最低限はどこかを判断して、計画は要所で変更していて、何をもって完成とするかをよく考えた結果ではあります。

 当たり前の話ですが、できたと言えばできあがりなのです。8月頃からですが、少なくとも私はできると思っていたし、みんなそうだったんじゃないかと思います。

 とはいえ、間に合わなかった機能についても年明けて2月3月あたりまでにほとんど実装されていました。いや実装したんですが。その頃にはだいぶOSらしくなっていて、気持ちよく新4年生を迎えることができました。

 新しくプロジェクトに入ってきた4年生が「まだ何も無いんですね」って言ってるのがもう面白くて仕方ない。こちらからみると荒野が空き地になっているくらいには見える。

 不思議な事は特に何もありませんでしたね。

この記事が気に入ったらサポートをしてみませんか?