OS作ってます。3日目 | 「ステュディオス」な生活

OS作ってます。3日目

さて、OSの開発も3日目です。
今回の内容は「32ビットモード突入とC言語導入」です。主にディスクイメージの読み出し方法を書く方法が説明されています。

これまで長年、コンピュータを使ってきて、ディスク装置にはシリンダやセクタというものがあるということは知っていたのですが、それをどのように読めとCPUに指示するのかはわかっていませんでした。
この章を読めば、フロッピーディスクを読み出す方法がわかります。

2日目でどんなときにどのレジスタに値を書き込むのか把握できていないと書いたのですが、たとえば、INT命令を呼ぶ前にINTの仕様で決められているレジスタに値を書き込まないといけないというのはわかるのです。
ですが、リトライ数のような値はなぜSIに書くのかというのかがよくわからないのです。

本書のコードにはそのことは説明なくさらっと登場しています。読み進めていけばわかる日が来ると信じて、今はそういうものなのだと割り切って進むことにします。

とにかく、この章では条件ジャンプ命令が何種類か登場し、高級言語にもあるような制御構文がだいたいアセンブラでどうやるのかがわかってきました。

前半はこんなところで、何となくブートセクタができあがり、ディスクイメージから決められたバイト数を読み込んで処理できるようになります。

後半はブートセクタとそこから起動したいプログラムの分離から、C言語で記述したプログラムを実行するところまでです。
また、その中でCPUの動作モードを32ビットモードに切り替えることもします。うーん、これまでは16ビットモードだったのか!ということもここでわかるわけです。

しかし、この章では肝心のモード切替とC言語で実装した部分を呼び出すアセンブラについての説明は先送りされています。後に説明があるようなので、気にせず進みます。

で、Cのプログラムのコンパイルは中間ファイルにまずコンパイルされた後、naskで読めるコードに変換され、naskによってオブジェクトファイルに変換された後リンクのためのデータをくっつけて、最後に他のオブジェクトファイルとくっつけてイメージファイルを作るのだということが説明されて、やっとC言語のプログラムが登場します。

本章で作るCのコードは関数が1つでコメントを抜くと10行にも満たないものです。
ですが、アセンブラで作った関数を呼び出す方法が説明されており、きっと今後の開発に重要な部分なのだと思います。

ということで、4日目からはC言語での実装が増えてくるのかなぁ。

最後に、ちょっとしたトラブルに見舞われた話をしておきます。
Makefileを書き換えないと僕の環境ではうまく動かないことを2日目に書きましたが、この章では書き換えてもはじめ動きませんでした。最後の最後でOSのイメージファイルがないといってエラーになりました。
特にmake中でファイルの生成には失敗していないようなのでおかしいなぁと思って悩みましたが、原因は意外なところにありました。

この章では生成するイメージファイルのファイル名が変更されるのですが、なぜか変更後のファイル名であるharibote.imgではNOD32がウイルスと間違い、生成と同時に隔離してしまっていたのです。
ちょっと驚いたのですが、幸い、NOD32はワイルドカードを使って検出無視ファイルを設定できるので、設定後は問題なく実行することができるようになりました。


30日でできる! OS自作入門: 川合 秀実 30日でできる! OS自作入門