ブートローダーがメモリに再配置されるのはなぜですか?
-
05-07-2019 - |
質問
ブートローダーを作成していますが、詳細の大部分を把握していますが、一部のブートローダーが実行の大部分を開始する前にメモリ内で自分自身を再配置する理由がわかりません。
誰でもこれを説明できますか?
この動作の例は、オリジナルのv0.01 Linuxカーネルブートローダーです。次のコメントが含まれています:
boot.sはbios-startupルーチンによって0x7c00にロードされ、アドレス0x90000に移動してそこにジャンプします。
解決
リンクされた記事から:
実際には、MBRには通常、ブートローダーが含まれており、その目的は別のブートローダーをロードすることです。これは、パーティションの1つの開始時に検出されます。これは多くの場合、アクティブとマークされた最初のパーティションを見つけ、その最初のセクターをRAMにロードし、実行を開始する非常に単純なプログラムです。慣例により、新しいブートローダーもアドレス7C00hにロードされるため、これを行う前に、古いローダーはそれ自体のすべてまたは一部を別の場所に再配置する必要がある場合があります。また、ES:SIにはパーティションテーブルのRAMのアドレスが含まれ、DLにはブートドライブ番号が含まれることが期待されます。このような規則を破ると、ブートローダーが他のブートローダーと互換性がなくなる可能性があります。
他のヒント
CookieOfFortuneは基本的に正しい(最初のブートローダーがあった場所に何かを移動したかったため)が、2番目のブートローダーではなく、カーネル自体でした。
彼のコメントから:
次に、システムを0x10000で読み込み、 BIOS割り込みを使用します。その後それ すべての割り込みを無効にし、 システムが0x0000に、変更が 保護モード、およびの開始を呼び出します システム。その後、システムは で保護モードを再初期化します それは独自のテーブルであり、有効にします 必要に応じて割り込みます。
彼はカーネルを0x0000 ... 0xKERNEL_SIZE-1に配置したいと考えていますが、初期ブートローダーは現在0x7C00にあるため、カーネルが〜32 KBを超えると、ブートローダーが移動中に上書きされます。カーネルが0x0000にあるという事実もこのコメントを説明しています:
"注意!現在、システムは最大で 8 * 65536バイトの長さ。"
0から始まる512 KBを超えると、x86アドレス空間の予約領域にヒットするリスクが発生します。
このコードセクションにはカーネルへの実際のジャンプが含まれていると思います
mov ax,#0x0001 | protected mode (PE) bit
lmsw ax | This is it!
jmpi 0,8 | jmp offset 0 of segment 8 (cs)
ブートローダーがROMにあり、ある時点でRAMにコピーする必要がある場合があります。