ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

ゼロからのOS自作入門

ゼロからのOS自作入門を1年かけて読みました。

book.mynavi.jp

長い時間かかりましたが、それだけの価値がある本です。 OSに限らずCPUや周辺デバイスの制御を手を動かしながら勉強したい人にお勧めです。

C++のソースコードが読みやすく、解説も詳しいです。ただ、扱っている内容が高度なのでちょっとよく分からないところがでてくるのはしょうがないと感じました。ただ、一回は動かしたという自信がつくので、今後何か必要な事が出てきたら、確実にこの本に戻ってこれます。

これからもずっと本棚に居続けるそんな本になりました。

本の内容

ブートローダーから始まって、GUI付きのOSを作っていきます。タスク(プロセス)の管理、入出力、ファイルシステム、GUIとパソコンっぽい機能が充実しています。最低限動くところをC++のソース付きで解説してあるのですが、その最低限の所がかなり上の方にありました。楽しいところだけ作ろうというのは感じるのですが、やっぱりOSとして動かしていく難しさがあって、それを一つ一つ乗り越えていきます。

1章~3章

開発環境の準備と、ブートローダを作り自作のカーネルが起動するまで。 UEFIを使った開発と画面の描画ができるようになります。

4章~5章

文字が書けるようになります。1文字を描画するWriteAscii関数は最後までお世話になります。 文字を書くためのフォントもここで導入します

6章~8章

最初の壁。PCIとUSBを動かします。マウスを動かしながら、割り込みやメモリマネージャを作ります。 CPU側ではセグメントの設定などアセンブラを使ってスタックの操作を行います。 ここはファイルごとコピーで分かったつもりで先に進んで良いと思います。 特にUSBの方は難しかった。

9章~12章

画面の表示を綺麗にしたり、タイマーやキーボードからの入力を行います。 目に見えてできることが増えて楽しくなってくるところです。

13章~14章

いよいよマルチタスクの導入です。ここもアセンブラが出てきます。 擬似マルチタスクから本当のマルチタスクへ。

15章~18章

ターミナルを作りながら、OSのユーザー寄りの機能を増やしていきます。 FATを使ったファイルシステムを導入し、lsコマンドを作ります。 ここからOSとアプリでソースコードが分かれてそれぞれ別々にコンパイルして動かします。 アプリ側ではcstring等の標準ライブラリの一部が使えるようになります。

19章

ページングの導入。ここも難しい。

20章

20章でシステムコールが導入されます。ここも難しい。 システムコールを導入するとともに、今までOSと同じメモリ空間で動いていたユーザーアプリをOSから分離していきます。

21章以降

21章から後は、新しい機能を追加しながら、システムコールが順番に増えていきます。 システムコールを増やす度にできることが増えていって楽しいところです。厳密にはOSではないのですが、自作OSでprintfが動いたのは感動しました。 メモリのコピーオンライトの実装がクライマックス感ありました。日本語の表示もできるようになります。UTF8のフォーマットもここで理解しました。

最後、画像ビューワーを起動しておしまいです。

写経

基本的にはソースコードをダウンロードして、本とソースを見ながら写経していきました。 USBの所で一度挫折して、難しそうな所は写経せず最初からコピペにしたらなんとか最後までいけました。 写経するかどうかは写し間違えたとき自分でデバッグできるかどうかを基準にしていました。

1日30分(1ポロモード)と時間を決めて写経を続けていて、9月からは毎日30分写経していたので終わりかなと思うとさみしいです。この本のC++はトリッキーな記述もなく、新しく使うC++の機能には簡単な説明もあります。最初から最後まで一貫したルールで書かれていて、毎日の写経がC++のコーディングスタイルを確認するような感じでした。

実装で関心したところはファイル周りの継承です。ファイルシステム上のファイルを読む、キーボードから文字を読み込む、パイプで別プロセスからの出力を読み込む、これらの全然実装が違う動きが同じように扱えファイルディスクリプタで一元管理されているのは実際に動かして驚きました。実務の継承もこれくらい綺麗に書けるとうれしい。

C++ちょっと勉強したけ複雑なプログラムをどこから作れば良いのか分からない人は、この本を写経すると良いでしょう。プログラミングの入門書に載っていないような、リアルな開発の進め方が体験できます。まずはmainにべた書きで一つだけ動きを確認する、一つ動いたら次を確認する、ある程度動いたところで別ファイルへ移動してI/Fを決め、それ以降はそのI/Fで動かす、といったループを何回も何回も繰り返します。機能はそのままでソースファイルを一気に整理するタイミングもあります。ここまでしなくても1章の最終形だけを解説しても十分なのに、全ての機能でこのステップを踏んでいるのが執筆大変だったと思います。

ソースコードは本の内容に合わせる形で、全てのタイミングでダウンロードできます。

github.com

デバッグで困ってにっちもさっちもいかなくなったら、ダウンロードした所から再開すれば良いので、挫折しかけても最後まで頑張れます。僕は、USBの所とページングの所がどうにもこうにもならなくなって、関係ありそうな所をファイルごと上書きして先に進みました。

USBはいつか自力実装したいところです。

最後

最後は、こういう画像ビューワーを作っておしまいです。教科書的な機能よりは見て楽しい機能を優先して実装すすめていきます。 ウィンドウを閉じる×ボタンも機能するのは最終日でそれまではただの絵なのですが、最初からいかにも動きそうな感じで描画されていて遊び心を感じました。

最初にこの本の事を書いたのが去年の三月なので、途中中断しながらも最後まで動かすのに一年間かかりました。

natsutan.hatenablog.com

もう一つ最後

本の最後に素敵な言葉があったので紹介します。

OSを作るにはコツがあります。それは、最初から完璧に作ろうとしないことです。最初から完璧を目指すと手が止まってしまって全然前に進まなくなります。

ちょうど今Cコンパイラを作っていて、OSの部分をCコンパイラに読み替えて元気もらいました。 素敵な本をありがとうございました。