2

基本的なブートローダーを作成しているのは、単純なCプログラムを作成し、それをハードディスク(ファイルシステムなし)に書き込んで実行できる環境があるところまでです。私がやりたいのはそれだけです。

これが私がこれまでにしたことです。

ステージ1:

  1. スタックレジスタとセグメントレジスタを設定する
  2. ビデオモードを640x480x8に変更します
  3. 次のセクターをメモリに読み込む
  4. はるかにそれにジャンプします

ステージ2:

  1. スタックとセグメントを再度設定します(これを再度行う必要がありますか?)
  2. GDTを設定します(この部分は私を混乱させます-TBH私はコピー/貼り付けするだけです)
  3. A20ゲートを有効にする
  4. プロテクトモードに入る

以前はプロテクトモードに正常に移行しましたが、何らかの理由で現在は移行できません。私が試してみると、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をロードしなくても、後でブートループが妨げられることはありません。

ちなみに...私のブートローダー(これは私の最初です)についての一般的なコメントがあれば、遠慮なく言及してください。

4

1 に答える 1

2

「ブートループ」は、おそらくコードがトリプルフォールトであることを意味します。

とにかく仮想マシンで実行しているのでqemu、2つの理由から試してみることをお勧めします。まず、そのWikipediaの記事には、「QEMUでは、トリプルフォールトにより、コンソールに仮想マシンのダンプが生成され、命令ポインターが最初の例外をトリガーした命令に設定されます」と書かれています。失敗している正確な命令をエミュレーターに指示させると、デバッグが非常に高速になります。

次に、それだけでは不十分な場合、QEMUはgdb仮想CPUへの接続をサポートします。これにより、コードをシングルステップで実行したり、レジスターの内容を印刷したり、通常のすべてのことを実行したりできます。オプションについては、qemuマニュアルページを参照してください。-gdb

于 2012-11-08T01:43:39.823 に答える