Skip to content
PG_MANA edited this page Oct 28, 2021 · 2 revisions

PG_MANAの個人ページ

PG_MANAです。 「ゼロからのOS自作入門」のレビューをさせていただいてました。 趣味ではRustでOS自作を行っています。

GitHub - PG-MANA/Methylenix: The operating system written in Rust

Methylenixはできるだけ実際のOSで行われているようなデータ構造をもたせながらデバイス初期化などの処理に重点をおいて勉強用に開発しています。 「MikanOSに新たな機能を追加したいけど何をしたら良いか迷ったから他の自作OSを参考にしたい」、などというときに一度参考にしていただけると幸いです。

「ゼロからのOS自作入門」を読み終えた方へ

「ゼロからのOS自作入門」のサポートページですから、読者の方に少しでもお役に立てたらなと思い少し文章を書いてみました。もしこの本を読み終えて何をすればいいかわからない、もしくはOS自作を続けるか迷っている方という方がいましたら読んでいただけると幸いです。

 「ゼロからのOS自作入門」を読み終えた時、どのような気持ちになったでしょうか。あまりにも分厚い本で読み終わるのに疲れてしまったでしょうか。内容が複雑過ぎて理解できずついつい読み飛ばしてしまったでしょうか。

 「なにかすごいものを作れてしまった。なんかわからないけどとてもワクワクする。」という方がいらっしゃいましたら、その気持ち、とても良くわかります。 かつて私が中学時代に「30日でできる! OS自作入門」を読んだ時、とても興奮したのを覚えています。 今までprintfで黒い画面に白い文字を出すしかできなかったC言語(30日本ではC言語を主に使用しています)でOSなんて言う巨大なシステムを作れてしまうんだ、これはとんでもない本だと思った記憶があります。 あなたがまだプログラミングを始めたばかりでWebページやPythonなどで簡単なツールを作ってみたりしただけの状態でこの本を読まれたのならば私と同じ気持ちになったのではないでしょうか。

 この本は今まで何気なくスルーしていた「PCという普段使っているコンピュータがどのように起動し、どのようにシステムを制御しているか」を暴き、その処理が他ならないプログラミングで実装されていることを教えてくれます。そしてその処理をその気になればあなたにだって実装できるということも教えてくれます。そのためこの本はただ読むだけでもコンピュータの仕組みを理解するのにとても役立つものだと思っています。

 そんな今まで気にも留めなかったことが自分にも作れるという興奮を覚えたのであれば、きっとこの本の続きを作りたいと思うでしょう。 まるで「地図さえあればこの地球上のどこでも行けるんだ」と感動とともに思わず家を飛び出す少年のように。  その気持ちはとても良くわかりますし、素晴らしいことだと思います。ただその気持ちのままにOSを改造したのであれば、それはおそらく失敗すると思います。 「画面は出ているのに音はならないなんて!!」、「インターネットにはアクセスできないなんて!!」と音楽を再生する機能を追加しようとしたりインターネットに接続しようと試みて、胸のときめきのままに何時間もパソコンをカタカタしてしまいそうです。中には既に先駆者の方がいてコードを公開なさっているのを見つけるかもしれません。 最初はブログに書かれているソースコードを見様見真似で書き写したり説明されている通りに実装してみたりして機能が増えていきますが、段々と開発のスピードが落ちてくるかもしれません。  そして頑張ったのに動かなかったり、挙句の果てには今まで動いていた機能が動かなくなったりするかもしれません。  その原因をインターネットで調べてみても何も出てこなかったりよくわからない英語のサイトが出てきたり、とても解決には程遠いと感じるかもしれません。 そうこうしているうちに飽きてしまって、何もできない自分に悲観して、グチャグチャになったOSのソースコードをまるごと消してしまいたくなるかもしれません。

 「ゼロからのOS自作入門」も「30日でできる! OS自作入門」もおよそ一ヶ月であなたの普段使用しているシステムによく似たものを作れる驚異的な本です。本の勢いのままにあと一ヶ月追加すれば、多くの機能を実装できる気がします。そんなあなたに一つ知っておいていただきたいのが「MikanOSもこの本も30日でできたわけではない」ということです。本を執筆されたことのある方、あるいはプログラミング経験が豊富な方は「なんて当たり前のこと今更」と思うでしょう。ですが特にプログラミング初心者の方はこの本たちがテンポよく開発を進めていく様子からついつそのことを忘れてしまうのではないかと思っています。筆者の方はせいぜい半年くらいでMikanOSを作ったのではないか、そんな気になってしまいそうなくらい、この本はぎゅぎゅっと要点が詰まっています。でも実際は何年もかかってMikanOSや「30日でできる! OS自作入門」のHariboteOSは開発されています。著者のuchanさんのブログによればUSBドライバの実装だけで1年半を要したそうです。それを本ではポンとまるで一日でできたかのように出てきます。OS自作の2つの本には実は「当たり前のように書かれているけどよくよく考えるとなんでそうなっているか分からない値」がたくさん出てきます。なぜPCIの「CONFIG_ADDRESS」はI/Oポートの0x0cf8にあるのでしょうか、その値はどこから出てきたのでしょうか、どうやって調べたらその値にたどり着けるのでしょうか、どうして様々なPCでのその値は共通なのでしょうか。私はかつて「30日でできる! OS自作入門」で何気なく出てくる固定値がどこから出てきたのかをしらべるのに苦労した覚えがあります。運が良ければ値を調べるだけでWikiなどがヒットし他の値がどういう意味なのかがすぐわかりますが、値だけ調べても何も出てこない場合も多々あります。結局英語で書かれたよくわからない巨大なPDFファイルをただひたすら読み進めるしかないことがあります。英語のよくわからない中学生にはとても酷なことかと思います。

 そうしてなんとかデータ位置と値の意味を突き止めても実装が正しくないとうまく行きません。特に実機ではデバッガでポチポチ条件を設定して値を見ることができないのでデバッグは難航するかもしれません。挙句の果てにはデバイスから仕様書で「ReservedValue」と書いてあるような値が読み取れたり仕様書にない動作をするかもしれません。ときには仕様書に書いてある内容の理解が間違っているかもしれません。プログラムのたった1文字が間違っているだけで全然動かないことだってあります。 OS自作本の著者の方々だって、「さんざんデバッグしてわかったことが読むメモリアドレスが1バイト違っていて、しかも間違ったアドレスからそれっぽい値が読み取れるからバグの原因だとは1ミリも思ってなかったことだけ」な私よりはましでしょうが、きっと厄介なバグに悩まされた経験があるかと思います(笑)。

 「ゼロからのOS自作入門」を読み終えた方は第31章があることに気がついたでしょう。プログラムも書かれていない2ページのあとがきみたいな章で読み飛ばしてしまったでしょうか。 実はここにOS自作で大切なことが詰まっています。私がレビューに参加させていただいた時に、「『30日でできる! OS自作入門』と同じように『After 30章』の章があると嬉しい。」とコメントさせていただき、光栄にも本に反映していただきました(元々追加される予定だったのかもしれませんが...)。  この章には、本を読んで続きを作る事に燃えるあなたに向けたアドバイスがたくさん書かれています。「なにか実装したいけどどうしたら...」と悩んでいる方へのヒントや、熱意をつなげる場所が記されています。特に太字の部分はかつて自作OSで挫折した私が深く共感する言葉です。きっと太字の部分を教訓にしていても壁に当たるときはあるでしょう。そして壁を乗り越えた先にある感動はおそらく身の回りの人とは共有しにくいことでしょう。マウスホイールの割り込みが発生しテキストを上下に動かせるようになって興奮のあまりあなたの家族にパソコン片手に力説しても「...?それのどこがすごいのさ...?」と冷めた感想が返ってくるでしょう。だってあなたが苦労して実装したことは大抵モダンなOSには既に実装されているのですから。

 OS自作は難しい割に大した共感も得られず地味なものかもしれません。割にも合わず熱意が冷めてやめちゃうかもしれません。  そんなときは是非31章やこの文章を読み返してみてください。うまく行かないなら別のことに手を出してもいいかもしれません、この部分は興味がないから既存のツールやライブラリを使うと割り切ってもいいかもしれません、あなたが熱中できそうな部分を実装すればいいのです。それでもうまく行かずに本と比べてしまいそうなときは、その本には「見えない失敗章」が沢山あると想像してみてください。きっと「第6.3.20章 なんか知らんけど、動かん、もう疲れた、寝る」なんて見えない章が一つくらいはあるでしょう、多分。

 あなたのOSが日の目を浴びて世界中でちやほやされて大金持ち、なんてことはおそらくないです。(MikanOSのように、続編の本を作るということはあり得るかもしれません。そうしたいと思う人は是非やってみてください。)ただ、このOS自作の経験はどこかで役立つと思います。複数のソースコードから構成される多層クラス構造なプログラムの設計・管理方法だったり、データの受け渡しをする際にどのように値が処理されているかを考慮したプログラムの作成だったり、デバイスドライバの実装など仕事にできることもあるかもしれません。私はとても幸運なことにOS自作をしていて、巡り合わせで「ゼロからのOS自作入門」のレビューをさせていただきましたし、ハードウェアに近いコードを書くお仕事もいただきました。将来の仕事に役立つからOS自作はやるべき、とは言いませんが、あなたの挫折やバグの見落とし、デバッグで潰れた睡眠時間はいつか思いもよらぬところでの成功や閃き、幸せなお昼寝の時間となるでしょう。

あなたのOS自作ライフが楽しくなることを祈って僭越ながら書かせていただきました。ここまで読んでくださってありがとうございます。

Clone this wiki locally