現代の量子力学

主に精進の様子を記録する日記帳です

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 にあるはず。
    というわけで、haribote.nasにORG 0xc200、ipl.nasの最後にJMP 0xc200 を書き足しておく。
 
7. OS本体の動作を確認してみる
    画面モードの切り替えをしてみる。
    画面モードの切り替えは、ビデオBIOSのAH = 0x00でできる。
    とりあえずモード0x13 を選択してみる。真っ黒画面が表示されれば成功。
 
8. 32ビットモードへの準備
    ここからはアセンブリ言語での開発をやめてC言語にする。C言語で書いたソースコードから機械語コンパイルするが、そのときに32ビットの機械語にしかコンパイルできない。のでここからは32ビットモードを利用する。
    BIOSは16ビット用の機械語で書いてあるため、もうBIOSには戻れません。
    最後に、キーボードの状態(NumLockがONかOFFかとか)を教えてもらう作業と、画面モードに関する情報をメモしておくことだけして16ビットモードはおしまいです。
 
9. C言語導入
    haribote.sys はアセンブラで書いた先頭部分とC言語で書いた後半部分から構成される。先頭部分ではC言語部分を読み出す。
    今まではharibote.nas からharibote.sys を作っていたが、これからはasmhead.nas とbootpack.c からharibote.nasを作る。
    bootpack.cから機械語にする部分がちょっとめんどくさい。
    例によって本に書いてある方法は使えないのでhttps://qiita.com/noanoa07/items/8828c37c2e286522c7eeを参考に。
    ただし、コンパイラi386-elf-gccではなくi686-elf-gccで。それに伴ってMakefileも書き換える。
コンパイルの話がつらつらと…
    C言語で書かれたソースファイル→機械語で書かれたオブジェクトファイル→他のオブジェクトファイルとリンク
    ここで、機械語で書かれたオブジェクトファイルをディスクイメージに書き込めば終わりかと思いきや、オブジェクトファイルには余計なもの(他のファイルとリンクするための特別な「のりしろ」)が含まれているのでそのままではダメ。
    C言語だけではプログラム全体を書くことはできないので、最終的にはアセンブラで書いた部分とくっつけて完成。これがリンク。
    その部分をhttps://vanya.jp.net/os/haribote.html#hrbで書かれている、リンカスプリクトを使うことでなんとかする。この辺もそのうち勉強しないと…
 
10. とにかくHLT
    C言語ではHLTできないのでアセンブリ言語で書く。
 
長い一日だった...おわり