30日でできる!OS自作入門を始めた[3日目]
今回は、IPLの作成と32ビットモード切り替えの準備、C言語導入が主なテーマ。
IPL
IPL(Inital Program Loader)はその名の通り、初期プログラムのローダー。
まずは、フロッピーの中身をどんどんメモリに展開していきたいわけだが、これにはBIOSのディスクサービスを使う。 BIOSのディスクサービスは、「INT 0x13」で呼び出せる。
http://softwaretechnique.jp/OS_Development/Tips/Bios_Services/disk_services.html
最初の1セクタ(512バイト)は、すでにメモリに展開されているので、2セクタ目から先を読み出していく。
展開先のアドレスはセグメントレジスタを使って指定できる。
はりぼてOSのIPLは、0x8000から0x83FFまでにフロッピーの中身を展開する。0x8000から512バイト、つまり0x81FFまでは1セクタ目を入れるので0x8200から2セクタ目を入れていく。
メモリマップ↓
0x7c00 ---------------------------
Boot Sector
0x7e00 ---------------------------
Free Space
0x8000 ---------------------------
Sector 1
0x8200 ---------------------------
Sector 2
0x8400 ---------------------------
また、フロッピーディスクはたまにうまく読めないことが有るらしい。 このための処理も書く必要が有る。
あとは、フロッピー内のすべてのデータを読み出していく。
フロッピーディスク一枚には80シリンダ、ヘッドが2つ、そして18セクタあり、一つのセクタが512バイトだから、
80 * 2 * 18 * 512 = 1474560byte = 1440KBのデータがある。
そしてフロッピーのデータが展開できるようになったのでOS本体を書いていくことが出来るようになった。
しかし、OSを実行するためにはIPLからOSにジャンプする必要があり、そのためにはどこにジャンプすべきか、すなわちOSがどのアドレスに展開されるのか知る必要が有る。バイナリエディタでharibote.imgを見てみるとファイルの先頭から0x004200番目に配置されていることが分かる。0x8000から展開をしたので、飛ぶべきアドレスは
0x004200 + 0x8000 = 0xC200
である。
これで、いよいよOS本体が実行できるように...!
そして、この本ではOS本体の実行を確認するため画面をグラフィックモードにして色を描画してみるということをする。前回と同じように、BIOSのビデオサービス(0x10)を使ってやればできる。
32ビットモードへの準備
C言語を使うためには、基本的には32ビットモードに切り替える必要が有るので切り替えていく。 ちなみに、32ビットモードに切り替えてしまうとBIOSのサービスは利用できなくなってしまうので、16ビットモードでやるべきことは16ビットモードでやっていく。
画面モードの切り替えは既にやったので、キーボードの状態(シフトやキャピタルロックの設定)をBIOSから取得しておく。 キーボードの状態取得はBIOSのキーボードサービス(0x16)を使えば良い。
ファンクション番号は0x02。出力はリンク先を見ればわかる。ALレジスタに出力されるので、これをメモリにコピーしておけば安心して32ビットモードへ移行できる。
C言語導入
いよいよC言語の導入だ。Harimain()関数をbootpack.cというファイルに書く。アセンブラでしか書けない内容は、naskfunc.nasというファイルに書いて、C言語から関数として呼び出す。
ところで、アセンブラのファイルとC言語のファイルの関連付けについてだが、これは両者をオブジェクトファイルにして、リンクをすれば良い。私は筆者のツールではなくgccやnasmなどの汎用ツールを使って開発しているためリンカスクリプトを指定してやる必要がある。このリンカスクリプトについては、偉大なる先人が公開されていたのでこちらをありがたく使わせてもらった。
https://vanya.jp.net/os/haribote.html
これでおしまい。