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