『ゼロからのOS自作入門』の実装を完走したので、やってみた感想や、完走するための自分なりのポイントをまとめました。
書籍『ゼロからのOS自作入門』とは
『ゼロからのOS自作入門』はタイトル通り、OS をゼロから作っていく書籍です。
2021 年 3 月に発売されており、2021 年かなり話題だったと思います。
前提
さて、今回この本の OS (MikanOS) の実装に挑戦してみたのですが、私は実はこの本自体はすでに一周読んでいました。
最初に実装なしで読んだときの感想については、「『ゼロからのOS自作入門』を読みました【感想・難しいと感じる方にオススメの事前準備】」という記事にまとめてあります。
読むだけでも色々と勉強になっていたものの、実装してみないと分からないことも色々あるだろうと思い、今回実装に挑戦しました。
感想
それでは、ここから実装してみての感想を書いていきます。
OS を作った達成感は大きい
実装してみて何より一番大きいのは、「OS を作った」という達成感があることです。
多くの方が想像している通りだと思いますが、OS の自作は楽ではなかったです。
その分、実際に作ってみた達成感は大きいですし、分かるようになったことも色々とあります。
感動ポイントがたくさんある
OS の実装を進めていると、感動するポイントがいくつもあります。
例えば、
- Hello World
- マウス操作
- ウインドウのドラッグ操作
- キーボード入力
- コンテキストスイッチ (プリエンプティブマルチタスク)
- ターミナルから外部コマンド (ELF ファイル) を実行
などです。
たしかに感動しそうだと思われるかもしれませんが、実際に実装してみると想像以上に大きな感動でした。
また、個人的には第 27 章の「アプリのメモリ管理」が特に好きで、
- デマンドページング
- メモリマップドファイル
- コピーオンライト
などの少し発展的な機能がこんなに普通に実装できるんだと感動しました。
OS 以外の勉強にもなった
MikanOS の実装を進める中で、OS の勉強になったのはもちろんですが、関連して
- C 言語や C++
- ELF やローダー
などの知識も得られました。
個人的に C++ を学びたいと思っていたので、練習の題材としても良かったです。
当然ですが、OS の勉強としてもこの上ないほど良かったです。
完走するための自分なりのポイント
それではここから、自分なりに完走するためのポイントだと思うことを書いていきます。
理解できない点があっても一旦先に進む
この本を読みながら実装していても、よく理解できない点がある程度出てくるかもしれません。
OS の実装はただでさえボリュームが大きいので、よく分からなかった点も一旦飲み込んで実装を進めてみると良いと思います。 (もちろん、なんとかして理解できるよう調べたりしてみるのも良いと思います)
自分の場合も、特に
- UEFI 関連
- セグメンテーションの設定
- 階層ページング構造の設定
などについては、かなり理解が浅いですが、ここをしっかり理解するには自分でゼロから (本の通りではない) OS を作るのが良さそうだと考えて、先に進みました。
全然分からない場合は、前提知識をつけて再挑戦する
一部理解できないというよりも、全体的に全然よく分からないという場合もあると思います。
よく分からないまま写経するのもある程度勉強になりますし、動作する様子のを見るのは楽しいですが、前提知識をつけるとより楽しめると思います。
「『ゼロからのOS自作入門』を読みました【感想・難しいと感じる方にオススメの事前準備】」という記事にも書きましたが、
- C 言語の基礎
- CPU の仕組みの概要
- OS の基礎
の知識があると、理解度が一気に高くなります。
特に OS に関して、
の 2 冊を読んでおくのが非常にオススメです。
起動手順をスクリプト化する
これは細かいテクニック的な話になりますが…
MikanOS の実装をやり遂げるには、ある程度長い日数がかかります。
途中で数日・数週間と時間が空いてしまう場合もあるかもしれません。
MikanOS を起動するにはいくつかのコマンドを実行する必要があり、それらを毎回思い出して入力するのは大変です。
そういった手順はスクリプト化したりすることで、実装に取り組むハードルを下げましょう。
筆者のコードを確認できるようにする
当たり前ではありますが、OS のデバッグは非常に大変です。
エラーが起こったとき、根本原因が簡単には分からないことも多いです。
自力でデバッグするのが一番ではありますが、MikanOS の実装はボリュームも大きいため、自力でのデバッグにばかり時間を割いていると大変です。
そこで、筆者のコードを確認する環境を整えることをおすすめします。
困ったときは、筆者のコードの 2 つの時点の差分を確認したり、自分のコードとの差分を確認したりしてみましょう。
なお、筆者のコードについては、以下の Issue で指摘されている箇所以外は、私が見た範囲では全て動作しました。
熱意を持つ・時間を確保する
最後のポイントとして、完走するために一番重要なのは、「OS を作りたい」という熱意だと思います。
この本に従って OS を実装することは、難しいというよりも大変 (熱意や時間が必要) です。
自分の場合、2022 年 3 月 8 日に取り組み始めて、実装完了したのが 2022 年 7 月 10 日と、4ヶ月ほどかかりました。
実際のペースとしては、
- 3 月 … day01-day02
- 4 月 … day03-day04
- 5 月 … day05-day07
- 6 月 … day08-day10
- 7 月 … day11-day30
といったぐらいでだいぶ偏りがあり、7 月になって時間をとれたので一気に進めましたが、当初のペースでは 1 年近くかかったかもしれません。
OS 自作に着手する前に、『コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方』(通称: Nand2Tetris) で CPU やコンパイラの実装をしたこともありますが、OS 自作のほうが遥かに時間がかかりました。
長期間かかるほど過去の内容を忘れやすくなるので、ある程度まとまった時間をとって取り組んだほうが、ゴールしやすいと思います。 (そういう意味では、学生のうちにやっておくと良いと言われたりするのはよく分かります)
おわりに
以上、MikanOS を実装しての感想や自分なりのポイントを書いてきました。
自分はこの実装を終えて、いわゆる低レイヤ関係でもっと色々作ってみたいと思いました。
- C++ でちょっとしたツールを作ってみる (ELF パーサやリンカ・ローダに興味あり)
- CLI (GUI なし) のみの OS を作ってみる
- デバイスドライバを作ってみる
- 改めて Linux について勉強してみる
などなど、今後もやっていこうと思います。