かさやぬすの日記

後で思い出したいことを書く

『30日でできる! OS自作入門』を読んだので感想。

おそらく将来仕事で関わることはほとんどないと思うけど、OSはPCを使ってる限り、必ずお世話になっているものだし、今のうちしかOSについて勉強する機会はないだろうということで、OS本の中では結構有名なこの本を買って読むことにした。

f:id:kasayanus:20190825235605j:plain

本全体の文調が技術書にしてはかなり砕けていて、一人ツッコミしたり、「あ~、今日は眠いのでここまで!」みたいな友達に話すような感じで、いい意味で人間味のある本だなぁと思った。著者いわく「中学生にも読めるようにしたい」とのことで、読んでいて内容以外の部分も面白かったし、クスッとなる箇所もあった。

f:id:kasayanus:20190825235627j:plain

著者 川合秀実

本の内容はOSをアセンブリC言語を使って0から30日でどれくらいの機能をもったOSを作れるか、ということを本の中で実践しながら学んでいくものである。

OSに関しては、以前まで「OSは機械と人間をつなぐソフトウェア」とか「OSの種類は~がある」とかくらいの表面的な知識しか持ってなかった自分にとっては、目からウロコな内容が多くてとても勉強になった(それでもまだまだ知識は浅いけど)。全体を通して一番感じたのはマジックナンバー多すぎ!!ということである。OSは当然、CPUの上に乗っかっているものなので仕様に従って、レジスターの値をいじったりするわけだけど、「"これ"をしたいときは"このレジスター"の"何ビット目"に"この値"を入れなければいけない」とかがいちいち決まっていて、CPUの仕様を調べて慎重にやらないといけなくて大変だなと感じた。もしこれらのマジックナンバーが学校の試験とかで出されたらお手上げである(歴史の年号を覚えるようなもの)。しかし、それでもOSに作り方で「こうやって作られてるんだ」という驚きと発見が多かったので、本の中で取り上げている個人的に面白かった項目をとりあえず列挙しておく。

 

目からウロコだったトピック。

1. ブートローダーからプログラムがはじまる。

PCを起動したら、最初に動くのは第一セクター(ブートセクター)に埋まっているプログラム、これをブートローダー、イニシャルプログラムローダー(IPL)と読んでいて、このプログラムにはOS本体を呼び出す命令が書かれている。この本では、このIPLもしっかり初めから実装していく。


2. 文字の出力の仕方(画素単位で色指定)。

OSの文字出力の実装では画素単位で色を指定して発色させるので、文字は配列で図形のように定義して使う。


3. C言語で使えない関数(printf)はアセンブリも合わせて実装する

OSごとに文字出力の実装が違うので当然C言語の基本的な関数(printf)などはOSの実装では使えない。その他にも特定のレジスターを直接いじる関数はC言語には存在しないので、OSの機能を実装する上でレジスターをいじる必要がある場合はアセンブリで関数を実装する。その後にC言語のファイルとアセンブリのファイルをリンクしてOS本体を作っていく。


4. マルチタスク処理

二つ以上のタスクを同時で行うことができるのは、CPUがそのタスクを非常に短い間隔で切り替えながら行っている。マルチタスクはそのみかけの動きである。マルチタスク処理の実装も本の中で行う。


5. 重ね合わせ処理

OSには便利なライブラリやフレームワークはないので当然ウィンドウも自分で実装しないといけない。さらに複数のウィンドウが重なったときに見え方についても自分で処理を実装しなければいけない。これを重ね合わせ処理という。この実装も非常に原始的で、普段アプリケーションを作っているだけでは全く意識しなかったことであり、OSづくりには手間がかかるんだなぁということを実感した。


6. マウス、キーボードの割り込み処理

OSはマウスやキーボードが押されたときに、CPUは一旦それまでのタスクを中断して一瞬だけ割り込み処理を行うようにできている。これを本では1から実装する。このトピックはとくにマジックナンバーが多かった。CPUに割り込みを知らせる特殊な回線が20個弱ついていて、それぞれがキーボードなど割り込みする機器とつながっている(何番目の回線がキーボードにつながっているとかはすでにCPUの仕様で決まっている)。割り込みしたときに実行する関数(ハンドラー)のアドレスを書く番地も決めて、実際に割り込みがおきたときは、CPUのこの番地の命令を呼び出すように決まっている。


7. メモリ管理

ある用途のために使いたいメモリ領域をあらかじめOSに登録しておいて後から他の用途でこのメモリ領域が侵食されるのを防いだり、アプリケーションがシステム用に使用されているメモリを侵食しないようにするのがメモリ管理。これも本ではC言語で実装する。本では誰でもまずは思いつくような方法でこれを実装している。このメモリ管理の実装は非常に多くの実装が考えられて、良くない実装だとメモリの仕様効率が著しく下がっていしまうこともある。メモリ管理の実装はOS開発でもかなり工夫が必要な箇所である、OS開発者の腕の見せ所の一つなのではないかと感じた。


8. コマンド(dir,cls)の実装

普段OSを使っていると特に意識することなく実行してしまうOSコマンド。これも本では実装する。これはキーボードの割り込み処理から特定のメモリ番地に書き込まれたキーボード情報から文字列を読み取って、それがdirとかclsと一致するなら、ファイル一覧を表示したり、コンソール画面をクリアしたりなどのコマンド処理に分岐するというふうなとても原始的な実装だった。


9. 解像度変更

 解像度の変更もマジックナンバーでどのレジスターのどの値を入れればHD解像度に変更できるとかがビデオカードの仕様から決まっている。

 

 

まとめ

このOS本ではOSの最低限の機能を実装するにとどめており、この後OSの機能を追加したり向上させたりすることは読者に任せるとしている。なので、例えば、ネットワーク機能、ファイル管理システム、ハードディスクの情報の読み書きなどについては触れていない。この本ではフロッピーディスクにOS本体やアプリケーションファイルなどを全てあらかじめ詰め込んでおき、それをメモリに流し込んで全てメモリ上で作業する事になっているので、ハードディスクとのやり取りについては書かれていないが、やはりOSはハードディスクとのやり取りも重要だと思うのでその部分はぜひ知りたいところであったが、筆者いわく「その部分まで書くと、3章分はさらに必要になる」との事だったので泣く泣く断念したのであろう。

ともあれ、この本を読んだおかげで、普段PCを使っているときにも「そういえばこのOSの機能ってどうやって実装しているんだろう」「この機能を実装するためにはこんな情報が必要になりそうだ」とかを自分で考えることができるようになったし、普段空気のように使っているOSについて疑問を持てるようになった事自体が大きな収穫なのかなと思った。