
私が知っていることは次のとおりです:
起動時に、BIOS は次のシーケンスを実行します。
1. 電源投入時のセルフテスト (POST)
2. ビデオ カード (チップ) の BIOS を検出し、そのコードを実行してビデオ ハードウェアを初期化します。3
. その他のデバイスの BIOS を検出し、その初期化関数を呼び出します
。4. BIOS の起動画面を表示します
。5. 簡単なメモリ テストを実行します (システム内のメモリの量を特定します)
。6. メモリとドライブのパラメータ
を設定します。7. プラグ アンド プレイ デバイスを構成します (従来の PCI バス デバイス)
。8. リソースを割り当てます (DMA チャネルと IRQ)
。9. ブート デバイスを特定します。
BIOS は、ブート デバイス (通常はブート可能ディスクとしてタグ付けされた複数のディスクの 1 つ) を識別すると、そのデバイスからブロック 0 をメモリ位置 0x7c00 に読み取り、そこにジャンプします。
しかし、この後何が起こるのでしょうか。つまり、この段階でBIOSはどのようにしてブートローダーに制御を渡すのでしょうか。?
答え1
上記の投稿で述べたように、BIOS は 0x7C00 へのジャンプ命令を実行することによって、ブートローダに制御を渡すだけです。
起動不可能なデバイスでは、最初の 2 バイトに INT 18 命令 (0xCD 0x18) (およびバイト 511、512 に 55aa) が含まれている場合があり、これにより BIOS は起動順序で次のデバイスに進むことになります。
答え2
0x7C00 について言及されたので、MBR ブートに焦点を当てます (GPT は別の問題です)。
おっしゃるとおり、BIOS はデバイスが起動可能であると判断すると (つまり、最初のセクターの最後の 2 バイトが 0x55AA である)、ディスクから最初のセクターを読み取り、0x7C00 から始まるメモリにロードします。ジャンプ命令を発行すると、CPU はそこにあるコードを実行し始めます。
次に何をロードして実行するかを判断するのはブートローダの役割です。ロードして次のステージにジャンプするコードは、最初のセクターに残っている 510 バイトに収まる必要があります。ハード ドライブにはパーティション テーブルもあるため、実際にはそれよりも少なくなります。
参考文献:起動シーケンス、独自のブートローダーを作成する