2. Wriging an OS

To: Linux-Activists@BLOOM-PICAYUNE.MIT.EDU
From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Subject: Re: Writing an OS - questions !!
Date: 5 May 92 07:58:17 GMT

In article <10685@inews.intel.com> nani@td2cad.intel.com (V. Narayanan) writes:
>
>どうも、皆さん
>この分野の「初心者」は暇がある毎に考えてきたのですが、どうやっ
>たら何もないところから OS を書き起こせるのでしょうか? そういう
>わけで、いくつか質問しますが、これらの質問に時間を割いて答えて
>下さるなら尊敬します。

誰かが答えたのものとは思いますが、LINUX については私が引き受けまし
ょう。私の個人的な経験そのままを書きます。普通はどのようにするのか
は知りません。

>1) カーネルを作っているときには、だいたいどうやってデバッグしま
>   すか?

使っているマシンと、作業の進み具合によります。もっとシンプルなシス
テムならたいていセットアップはもっと簡単です。プロテクトモードの 
386 で私がやらなければならなかったことをかきます。

一番厄介な所は一番最初です。printf 等が使える最低限のシステムさえ手
に入れた後であっても、386 でのプロテクトモードへの移行は楽しくな
いです。386 のアーキテクチャを良く知らぬままに始めたのであればなお
さらです。この段階システムでは、死にたくなるほどリブートしまくりま
す。もし 386 がなにかがヘンだと気づいた日には、シャットダウンして
リブートしてしまいます。何が悪いのかの証拠を残す暇もありません。

printf() もたいして役に立ちません。リブートすれば画面もきれいさっぱ
りです。それから、VRAM も叩かなければだめです。VRAM はセグメントが
間違っていたりすると落っこちてくれます。デバッガなんて考えるだけ無
駄です。386 のプロテクトモードまでついていくデバッガなんて聞いたこ
とがありません。386 エミュレータや、一部の重装備のマシンならなんと
かなるかもしれませんが、大抵は駄目です。

私が使ったのは、ただの時間稼ぎのループでした。

die:
        jmp die

このうようなものをここぞというところに入れます。止まってしまえば OK
ですし、リブートしてしまったら、すくなくともこの die ループの前が怪
しいとわかります。
変わりにサウンドポートも利用できますが、私は PC のハードはいじった
ことがなかったので、全然使いませんでした。これ以外に方法がないわけ
ではありません。私はカーネルを書こうと思って始めたのではなく、ただ 
386 のタスクスイッチ等について知りたかっただけです。しかし、とにか
くこうして書き始めました。(91年の4月のことでした)

最低限のシステムが出来上がり、スクリーンを出力に使えるようになる
と、少々楽になります。しかし、ここで割り込みを有効にしなければなり
ません。ドカ〜ン。いきなりリブートして、また最初の方法に逆戻り。全
てがこの調子で、およそ 2 か月かけて、386 のまわりをまともに動くよう
にしました。それからは、リブートしないようにと気を使いながら、同時
に基本的なもの(ページング、タイマ割り込み、単純なタスクスイッチャ、
セグメントのテスト)を作るということをしないで済むようになりました。

>2) カーネルを違う OS の上で、プロセスとして走らせることで、動作
>   を確認できますか?
>   そのとき、(開発中の) OS が「特権」レジスタを操作しようとすれ
>   ば、(開発環境の方の) OS で例外が発生しませんか?

ええ。だいたい出来るなものもありますが、例えばデバイスドライバはた
いてい、裸のマシンでテストしなければなりません。LINUX を開発するの
に MINIX を使ったので、I/O レジスタや割り込み等はいじることはできま
せんでした。こういうものも DOS の上でなら、全ていじることができます
が、こんどは 32bit モードがありません。インテルもたいしたことありま
せんね。68040 かなんかだったら、もっと楽にできたでしょう。

単純なタスクスイッチャ(タイマ割り込みを利用して、AAAA...、BBBB....
のように表示する 2 つのプロセスの間を行ったり来たりしました。)が出
来ても、なお、だいたい printf を使ってデバッグをしなければなりませ
んでした。最初にキーボードドライバに手をつけました。ちなみに、一番
最初に書いたので、今でもオールアセンブラなわけです。(まだ C に移そ
うという気にはなれません。まだインストラクションのレベルでデバッグ
をしているからです。)

シリアルドライバを書き上げました。うむ。これでシンプル(実際はそれほ
どシンプルでは有りません)な端末のプログラムが走りました。走っている
プロセスは例のやつ(AAAA..)ですが、今度はコンソールやシリアルを読み
書きできるようになりました。
この状態から抜け出すにはリブートするしかありませんでしたが、これで
小さなカーネルができました。

これから後は楽勝でした。まだ危ないところはありましたが、いくつかの
デバイスが出来ていたたので、デバッグは楽になりました。この頃には C 
を使い始めました。それで、確実に開発のスピードが上がりました。
また、「あの MINIX より良い MINIX」を作るという誇大妄想を真剣に考え
始めたのもこの頃からでした。いつの日か LINUX の上で GCC をコンパイ
ルできたらと夢に思うようになりました。

ハードディスクドライバはもっと酷かったです。この時にはドキュメント
の不備がにわかに問題となりはじめました。PC は現在世界中で最も利用さ
れているアーキテクチャですが、だからと言ってドキュメントがより揃っ
ているというわけではありません。事実、私は AT の中で 386 と 387 が
どうやって接続されているかを書いた本ですら一冊も見たことがありませ
ん。(Bruceさんありがとう)

次は小規模のファイルシステムです。うむうむ。これで最低限の UNIX で
す。基本的なセットアップに 2 か月かかりましたが、それから少しでディ
スクドライバ(ひどくバグっているのですが、何故かうちのマシンでは動き
ました)と小さなファイルシステムができました。この頃に 0.01 を世に出
しました。(91年末?か、とにかくそのあたり)
0.01 は美しくありませんでしたし、フロッピードライバも無く、たいした
ことは何もできませんでした。でも、この時からもうやめられなくなりま
したし、MINIX をうちから追い出すまでは止める気もありませんでした。

>3) リンカとローダは基本的なカーネルが走るようになるまえに必要に
>   なりますか?

0.11 までのバージョンまでは、どれも MINIX386 の上でクロスコンパイル
しました。ユーザープログラムも同様です。0.02 の上でようやく bash と
GCC が出来上がりました。
しかし、キャッシュの中の気まぐれに振舞うコードのせいで、GCC で GCC
をコンパイルすることは出来ませんでした。もっと小さなものでは対処す
ることができました。
0.03 (10月?) では GCC を GCC でリコンパイルできました。多分実際に私
以外の人が使い始めたのは、このバージョンからでしょう。まだもって、
フロッピーは使えませんでしたが、基本的なものはだいたい動きました。

0.03 を出した後、次のバージョンは実際に使えるものにしようと決心しま
した。(この時も印象的ではありましたが、0.96 で X が走ったときに比べ
ればかわいいものです。)
そして、次のバージョン(10月?)番号は 0.10 にしました。まだ、キャッシ
ュのコードに比較的重大なバグがありましたが、パッチをあてたあとはう
まく動いてくれました。
0.11(12月)には始めてフロッピードライバを搭載しました。それから、こ
の時点から、LINUX の上で LINUX の開発をするようになりました。タイミ
ングよく、/dev/hd2 に自動問い合わせ(autodial)しようとしている最中
に、MINIX386 のパーティションを間違って捨ててしまいました。

この時にはみんな LINUX を使っていました。そしてメモリ不足に悩んでい
ました。最高に悲しかったのは 2MB のマシンでは GCC が動かないことで
した。c386 が移植されましたが、GCC にしかできないことがあり、カーネ
ルをリコンパイルできませんでした。そういうわけで、ディスクページン
グを組み込まざるを得ませんでした。1月(?)に発表した 0.12 では、私の
ページングと tytso 氏によるジョブコントロールがまともに動いてまし
た。
(その他のパッチでは、pmacdona 氏が VC を作り始めました)このとき、初
めて本質的な変化がなく、部分的に私以外の人が書いたリリースが出まし
た。そして、このとき初めて多くの点で MINIX よりも良くなりました。そ
れから、本当に人々を引き付け始めました。

それから 0.95 が 3月に出て、4月にバグが取られ、すぐに 0.96 が出まし
た。LINUX には本当に楽しませてもらいました。(そして、ずっとそうだと
確信してます)反応は非常に好意的ですし、こういうことをすれば非常に沢
山のことを学ぶことができるでしょう。
(ちなみに、ほかの方面のでの学習は妨げられますけど :)
 
                Linus

(SGML conversion: yuji senda)