|
ブートローダその2 BIOSの処理
|
最初のセクタを読み込む
電源を入れてからBIOSはハード周辺をチェックして、フロッピーやCD、HDDなど
の最初のセクタを読み込むことがわかりました
ではどうやって読み込んでいるのでしょうか?
先ほどの説明に出てきましたように割り込みベクタからフロッピーの読込み処理を
呼び出して最初のセクタを読込ます
フロッピーの読込処理
フロッピーの読込処理を呼び出すためにはアセンブラ言語のINT命令を使います
INT命令をプログラムで実行させると割り込みベクタから
割り込み処理(フロッピーの読込処理)のアドレスを
読んでそこに勝手にジャンプして割り込み処理(フロッピーの読込処理)してくれます
割り込みベクタの何番目にフロッピーの読込処理のアドレスが入っているのかは
あらかじめ決まっていて、割り込みベクタの25番目(16進数では0x19と表します)にあります
割り込みベクタの25番目(0x19)
上で”フロッピーの読込処理”と書いておりますが、何やら
この割り込み処理はいろいろしてくれます。起動時にBIOSから呼び出されて
CDやらHDDなどの読込もしてくれるようです(細かいことはあほなのでわかっておりません。。。)
この割り込み処理では”ブートローダその1”で説明しましたヘッド、シリンダ(トラック)を指定して
起動ディスク(フロッピーやCDやHDD)の最初のセクタ(ヘッドの0番目、シリンダの0番目、セクタの1番目)
である512バイト(フロッピーの場合)を読み込みます。
何故かはわかりませんが、ヘッドとシリンダは0番目から始まり、セクタは1番目から始まります
読み込んだ512バイトの最後の511バイト目と512バイト目がそれぞれ0x55と0xAAであれば
メモリの0x7C00番地に最初のセクタがコピーされます
511バイト目と512バイト目が他の値の場合は次のディスクデバイスの最初のセクタを読みに行きます
0x7C00にブートローダがコピーされると0x7C00から処理を開始します
ここまではBIOSが勝手にやってくます
これから作るのはこの0x7C00に読み込まれる512バイトのプログラムになります
さて、いよいよ次からブートローダを作ってみますが、その前に使用するアセンブラについて少し
アセンブラ言語について
環境準備の段階でアセンブラ言語としてGASとNASMをインストールしましたが、
NASMのプログラムのほうがちょっとばかし簡単に見えるので(もちろん簡単ではありませんが。。。)
ここではアセンブラ言語としてNASMを使いたいとおもいます
しかし、本当はGASのほうが後々役に立つと思います
GCCでC言語をやっているとアセンブラ言語でしかできないところもあり、
そこはGCCのアセンブラであるGASのほうが断然親和性が高いからです
ですので、我こそはという方はGASでやってみてはいかがでしょうか
(C言語でソースを作る段階ではGASに移行します。GASじゃないとやはり面倒くさくなってきます)