3日目 32ビットモード突入とC言語導入
1. さあ本当のIPLを作ろう
INT 0x13 → BIOS関数。ディスクの読み込み書き込み、etc…
AH = 0x02 でディスクの読み込み。
指定されたレジスタに値を入れて関数呼び出し。
ディスクのどの場所を読み出すか?
シリンダ、ヘッド、セクタを指定して場所を指定する。
メモリのどこに読み出すか? などを指定。
2. エラーになったらやり直そう
フロッピーディスクが読めないことがよくある。仕方ない。
そういう時は何度も読み直せば良い。5回くらいは読み出すようにした。
3. 18セクタまで読んでみる
読み取るディスクのセクタ番号(レジスタCLに入れて指定)をインクリメントしていって18セクタまで読んでみる。
AL=17(何セクタまで一気に読むか?)を指定してもいいが、後々問題が生じるらしいので、いちいちインクリメントしていく。
4. 10シリンダ分を読み込んでみる
C0-H0-S18までいくと次は、C0-H1-S1。ヘッドがインクリメントされる(セクタは1-indexedでシリンダ、ヘッドは0-indexed?)
この調子で、シリンダ9まで読み込んでみる。
これで、ディスクを読み取る部分を書いてブートセクタはかなりできた。
5. OS本体を書き始めてみる
HLTするだけのプログラムを書いてみる。→haribote.nas
これをアセンブルしてharibote.sysを作成。これをディスクイメージharibote.img に”普通に”保存。
ファイル名は0x002600以降に、ファイルの中身は0x004200に入る。
あとは、OS本体をharibote.sysという名前で作成してディスクイメージに保存し、ブートセクタからこのharibote.sysを実行させるようにすればいい。
6. ブートセクタからOS本体を実行させてみる
ディスクイメージ上で0x4200に位置するこのプログラムを実行するには?ブートセクタの先頭がメモリの0x8000番地に来るようにディスクをメモリに書き込んでいるので、0x4200はメモリの0x8000 + 0x4200 = 0xc200 にあるはず。
7. OS本体の動作を確認してみる
画面モードの切り替えをしてみる。
画面モードの切り替えは、ビデオBIOSのAH = 0x00でできる。
とりあえずモード0x13 を選択してみる。真っ黒画面が表示されれば成功。
8. 32ビットモードへの準備
ここからはアセンブリ言語での開発をやめてC言語にする。C言語で書いたソースコードから機械語にコンパイルするが、そのときに32ビットの機械語にしかコンパイルできない。のでここからは32ビットモードを利用する。
最後に、キーボードの状態(NumLockがONかOFFかとか)を教えてもらう作業と、画面モードに関する情報をメモしておくことだけして16ビットモードはおしまいです。
9. C言語導入
bootpack.cから機械語にする部分がちょっとめんどくさい。
例によって本に書いてある方法は使えないのでhttps://qiita.com/noanoa07/items/8828c37c2e286522c7eeを参考に。
コンパイルの話がつらつらと…
ここで、機械語で書かれたオブジェクトファイルをディスクイメージに書き込めば終わりかと思いきや、オブジェクトファイルには余計なもの(他のファイルとリンクするための特別な「のりしろ」)が含まれているのでそのままではダメ。
その部分をhttps://vanya.jp.net/os/haribote.html#hrbで書かれている、リンカスプリクトを使うことでなんとかする。この辺もそのうち勉強しないと…
10. とにかくHLT
長い一日だった...おわり