2016-05-15 2 views
2

私はCorebootのコードを読んでいましたが、最初は保護モードに入っています。これはIntel x86ブートストラップでは普通です。その後、ペイロード(この場合はseabios)をロードして呼び出します。 seabiosはハードウェアデバイスに必要なすべての初期化手順を実行しますが、これらの手順のいくつかはリアルモードで実行する必要があり、最後にBIOSは常に0x7c00のOSブートストラップをリアルモードで呼び出します。Coreboot + SeaBiosモードスイッチ

私の疑問と疑問は:どの時点で保護モードとリアルモード(再び)の切り替えが発生するのですか?

最後のプロセッサモードは、ビッグリアルモードですか?

ありがとうございました

+0

Seabiosは、従来のBIOSを搭載した典型的な386クラスのマシンと同等の機能を備えています。マシンを非リアルモード(16ビット)にし、0x0000:0x7c00にジャンプしてディスクのブートセクタをロードします。 –

答えて

0

私は同じ質問がありました。 seabios実行フローのマニュアル[https://www.seabios.org/Execution_and_code_flow]]によると、POSTの最後のフェーズはブートフェーズです。ブートローダーへの呼び出しはcall_boot_entry()で始まり、farcall16()を引数 "0x07c0"で呼び出します。 farcall16は、CPUを "0x07c0"にリダイレクトし、jmpを "0x07c0"に戻すようにCPUを切り替える組み込み関数transition16を呼び出します。

+0

実際には、セグメントは0x07c0(フロッピー/ハードドライブから起動する場合)として開始されます。 'call_boot_entry() 'の呼び出しの前にセグメントをセグメント:オフセットのペアに正規化します。結果は 'bootseg'に0x0000のセグメントと' bootip'に0x7c00のセグメントです。 16ビットのリアルモード(実際には非現実モード)への切り替えが完了するまでに、BIOSは物理アドレス0x07c00である0x0000:0x7c00に飛躍しました。 –

+0

@MichaelPetch farcall16に引数0x07c0があると言って、私は32ビットから16ビットへの遷移がどこで起こるかを答えるために物事を単純化しようとしていました。実際には、私がスキップした多くの詳細があります。 – user2921947