基本的なブートローダーを作成しているのは、単純なCプログラムを作成し、それをハードディスク(ファイルシステムなし)に書き込んで実行できる環境があるところまでです。私がやりたいのはそれだけです。
これが私がこれまでにしたことです。
ステージ1:
- スタックレジスタとセグメントレジスタを設定する
- ビデオモードを640x480x8に変更します
- 次のセクターをメモリに読み込む
- はるかにそれにジャンプします
ステージ2:
- スタックとセグメントを再度設定します(これを再度行う必要がありますか?)
- GDTを設定します(この部分は私を混乱させます-TBH私はコピー/貼り付けするだけです)
- A20ゲートを有効にする
- プロテクトモードに入る
以前はプロテクトモードに正常に移行しましたが、何らかの理由で現在は移行できません。私が試してみると、Bochsはブートループに入りますが、私が知る限り、コードは機能していた古いコードと同じです。
A20とGDTを有効にするための呼び出しをコメントアウトしようとしましたが、ブートループを防ぐことはできませんでした。
私はここPasteBinにブートローダーコード全体を持っていますが、ここにもいくつかのものを入れます:
スタックの設定:
CLI ;Disable interrupts while setting up the stack
XOR AX,AX ;Real mode flat memory model
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX
MOV SP,0xFFFF
STI ;Enable interrupts
A20の有効化:
MOV AX,0x2401
INT 0x15
RET
プロテクトモードに入る:
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
GDTコードは少し時間がかかり、自分で作成したわけではありません。しかし、私が言ったように、GDTをロードしなくても、後でブートループが妨げられることはありません。
ちなみに...私のブートローダー(これは私の最初です)についての一般的なコメントがあれば、遠慮なく言及してください。