この素晴らしい世界に変革を!

とある物忘れの激しい高専生による備忘録

30日でできるOS自作入門を読了しました

はじめに

みなさん、なんだかお久しぶりですね。ヤマゲンです。今回はだいぶ前に記事に書いた『30日でできるOS自作入門』を読了しましたので、まとめながら自分の理解度を測って、まああとは適当な所感といいますか、感想を述べられたらいいなと思います。寝起きなので拙い文になったら申し訳ないです。OSを作ってみたいと思う人の参考になったら一番ですが、なんとなくセキュリティ・キャンプ前の自分の状態を可視化できるようにしておきたいと思ったので書きます。ということで、割と自己満足な記事になりそうですが、夏休みでめちゃくちゃ時間があってなにかしないとだめになりそうって人は読んできただけると幸いです。

まとめ

正直この本の内容について理解してるとは言い難いです。まあそりゃCはそれなりに書いたり読んだりしてるんですけど、言うなればポインタ天国ですね。OSを作る上で大事になってくるのはメモリの操作だと思います。まあ実際そうなんだと思うんですけど、ポインタについての理解、または構造体についての知識に暗いと、割と辛い戦いになります。まあ30日なんて言ってますが、前記事を書いたときの日付見てもらうとわかると思うんですけど、かなり時間経ってますね。もう30日なんてかわいいもんじゃありません。まあここには僕の集中力(今これだけの記事を書いても切れるような貧弱なもの)も関係してくるのですが、Cやアセンブリに慣れていない僕にとっては長い30日となりました。まあだからと言ってCが嫌いになったとか、低レイヤが嫌いになったとか、そんなことはなくむしろ逆に、これからどうやって拡張していこうかという前向きな気持ちのほうが強いです。ただ、もう何回か30日を繰り返す必要がありそうですが(笑)

なんだか感想みたいになってきてしまったのでとりあえずまとめをつらつらと書いていきたいと思います。まずアセンブラですかね。これについては正直最後までよくわかってないんですよね。ここに関する理解が曖昧だったから結構キツかったってのが大きいと思います。これから始める人はじっくりアセンブラのところを読んでおくことをおすすめします。Makefileに関しては読む必要があったのでだいたい読めるんですけど、書けません。まあ正直ここはなんとかなるんじゃないかって思ってます。

あと、戸惑ったのはBIOSですかね。BIOSというと、自作PCを組んだときの、OSが立ち上がる前の状態だとかそういったことを指していたので、こんがらがりました。今もよくわかってません。

あとは割り込みとかですかね。割り込みの処理というか、概念自体はマイコン制御などで使っていたのでなんとかわかってました。まあ解説も丁寧だったのでここはわかりました。これでキーボードやらマウスやらが使えるようになるわけですね。

そうすると次はスタックですね。この本ではFIFOが使われていました。まあここは仮にも基本情報技術者ですので、わかりました。まあこれがたくさん出てきたりするとごちゃごちゃしてきて全くわからないわけですが。仕組みを理解してるだけでは使えないのかという、なんとも悲しい無力感がありますね。

あとはその後はメモリ管理ですかね。ここもだんだんわからなくなってくるところですね。僕は学校で割とみっちりイメージを植え付けられたので、ほとんどイメージだけでついていきました。ただここらへんになってくると複雑な構造体が絡んでくるので一気に見るとよくわからないです。僕は寝たら記憶が飛んでしまうので、構造体なんかが使われていても最後の方は全然なにがなんだか覚えてなかったです。

次にくるのがウィンドウですね。この章こそ構造体のオンパレードですね。shtとか、まあ概念はさほど難しくないんですけど、コードに起こすとまるでわけがわかりません。しかもこれはコンソールだとかアプリだとかで最後の最後まで絡んできます。ここはしっかり抑えておかないとなあと思います。主にやることはレイヤの順番だとか、ウィンドウを動かした時の処理だとかですかね。これだけでも結構たいへんです。途中のリフレッシュなんかも最後まで付き合うわけですが、ここも重要ですね。

タイマなんかは、それこそPICで触ったので慣れ親しんでるつもりです。ただその後の高速化だとかは難しかったですね。ここを見直せば早くなるからこことここを改良して...っていう感じで進んでいくんですけど、とてもペースが早いです(笑)それほど作者さんにとって楽しい部分だということはわかるんですが、ここあたりの処理の改善で考えることを諦めました。これはいろいろ意見あるとおもうんですけど、本を読んでていつも思うのは、これをいざ自分が実装しようと思ったらできるか、ってことなんですよね。この本でもいろいろ考えてましたが、ここはこんだけ知識と経験がないと絶対わからないなと思いました。まあその後からは吹っ切れたのですが、やっぱりこの辺りは読んでてつらかったなと思います。

さて、その後は山場のマルチタスクですね。ここは非常につらかった!(笑)頭が悪いので文字の説明でもコードの説明でも難解で、ずっとにらめっこしてた気がします。しかも具体的な機能はタイマくらいしかなかったので想像力も働きません。ここではもうコードと概念で理解するしかないというなかなか僕にはきついところでした。タスクの切り替えやら優先順位なんかは実際にアプリが動くまではよくわからない概念だったので読んでてもイメージがつかめずなかなか捉えられませんでした。

そしてようやくコンソールの実装になるわけですね。だんだん難しくなってくるわけですが、ここも処理がたくさんあって難しいです。またコンソールはここから最後までガッツリ使うので、最後の方はかなり忘れててつらかったです。一つ一つの処理は特に難しくはないのですが、文量でやられそうになりますね。

次からはコマンドの実装です。ここ辺りはやってて楽しかったです。低レイヤのつらいところは、目に見えない、ということじゃないでしょうか。高レイヤばかりやってた自分にとってはそうでした。ここでついにOSと対話できるようになるわけですね。今までは一方的に渡されていたのでちょっとうれしいですね。さて、いろいろコマンドを実装したわけですが、まあここは拡張性を感じられるところでした。今までは、確かに強い人から見れば、ここはもっとこうできる、みたいなものがあるかもしれませんが、本当の初心者であるぼくは正直言われるがままつくってました。ただコマンドでついに、自分でも頑張れば他のコマンドも実装できそうと思ったわけですね。

さて、この本も佳境を迎えてついにアプリの実装です。アプリが動く仕組みなんかがしれて結構面白いところでした。今までもそうでしたが、結構力技が多くてようやくちょっと親近感が湧きました。まあ結局最後までアプリを作ることになるんですけど、ようやく、ウィンドウやらタスクやらの恩恵が感じられてそこでようやく理解が追いつきました。まあここも開始何バイトみたいなものが必要で得意ではないところではないですが、割と慣れてきていたのでつらくはなかったです。

APIもありました。APIの実装はなかなか難しい概念で、説明でも「これでいいのです」みたい感じのことが多くて、うーんという感じです。ここはたくさん見直す必要がありそうです。ただOSを使う人間としては、APIの実装ってめちゃくちゃ大事な部分なので、いろいろ充実させてみたいという気分でもあります。やれることの幅が広がるので、もっと詰めたいなとおもいます。ここは途中でレジスタだとかが絡んでくるのですが、そこは例によってよくわかってません。

あとはセキュリティですね。ここは今回のセキュリティ・キャンプともつながるところで、OS開発を通して安全なソフトウェアを開発するという面で見ると大事な部分ですね。といってもやってることはCPUの設定に任せてるって感じもありますが、ここはアセンブラがたくさん出てきて大変でした。

まあざっくり言えばこれくらいですかね。あとはアプリ開発での作法だとか手法だとかだった気がするのでちょっとレイヤが違う気がします。というわけでまあ機会があれば別のときにでも。

と、まあ長々とまとめを書いてみたわけですが、見返すととんでもない量になってますね。あとは簡単に感想書いて締めたいと思います。

感想

まあ感想と言ってもほとんどは前に書いたのでちょっとだけ。

正直僕はこの本を買った時、読み切ることはなさそうだなと思ってました。そりゃそうです。一瞬で集中力が切れて、普通の本でも何週間もかかってようやく読み切るような人間がこんなに分厚い(最後見たら700ページ位ありました)本を読み切れると思いません。その点に関しては、セキュリティ・キャンプにいい機会を与えてもらったなと思います。まあまだ始まってもいませんが。テスト期間も挟んでしまって、なおさら読みきることが難しくなりましたが、講師の方にたくさんケツを叩かれ、なんとか始まる前に読み切ることができました。作ってみたあとでも、全然わからん部分が何箇所もあって、こりゃ何回も読み直すわけだ、と思いました。まあそれでも面白さみたいなのはとても伝わってきました。あとがきにもありましたが、これはほんとにはりぼてだけで、もっといろんな改良ができるわけです。まあそこまでやるかどうかってのは置いておいて、そういった機会に恵まれたのがちょっと嬉しかったりもします。OSってほんとにいろいろやることがあって、そのほんの一部だけしか作ってないってことを知るとやっぱりちょっと途方に暮れますが、とにかく少しずつ拡張できたらいいなと思います。

というわけで気づいたら4000字超えてました。この辺にしときますね。めんどくさいのでこのまま垂れ流しますが、勢いで書いたので、見苦しいところも多かったと思います。読んでいただけた方がいらっしゃいましたらうれしいですね。