レガシーBIOS(X86アーキテクチャを考慮)を使用すると、ブートローダはリアルモードカーネルの場所(header.Sアセンブリファイルで定義されているオフセット512)にジャンプし、リアルモードコードを起動します。その後、リアルモードコードはスタックとヒープを準備し、リアルモードで再びmain.cにジャンプします。 UEFIブートメカニズムはどうですか?まだリアルモードのカーネルコードを使用していますか?ブートローダはheader.Sの同じ部分にジャンプし、リアルモードで同じコードを制御しますか?より正確には、ブートローダがオペレーティングシステムコードにジャンプするときにカーネルを初期化するとき、既存のBIOSブートとUEFIブートの違いは何ですか?
答え1
EFIスタブメカニズムを使用する場合、リアルモードコードは使用されません。ファームウェア(マシンの起動時にマザーボードのフラッシュROMで実行されます)は、カーネルイメージをロードする前にプロセッサを保護モードに切り替えます。カーネルイメージヘッダーは、UEFI 仕様で要求される PE 実行可能ファイルのように見えるように構成されています。詳細については、次を参照してください。このインテルの記事。
編集する:以下のコメントに必要な情報を追加しました。ファイルを有効にするエントリポイントがarch/x86/boot/header.S
含まれていますCONFIG_EFI_STUB
。ファームウェアコールはヘッダーにあります。ルーチンはとにefi_pe_entry
あります。前者は構造を構成し、コマンドラインで指定されている場合はinitramfsもロードします。カーネルコマンドラインも異なる方法で処理されます。 UEFIもこれを処理しますが、UEFIはUCS-2エンコード文字列(Unicodeのサブセット)を使用するため、ASCIIに変換されます。両方とも、EFIスタブと既存のブート方法の間で一般的に使用されるコードがたくさん含まれています。arch/x86/boot/compressed/head_64.S
make_boot_params
efi_main
arch/x86/boot/compressed/eboot.c
boot_params
header.S
head_64.S
市。 UEFI はいつか x86 プロセッサのリアルモードから永久に外れることがあります。最新のオペレーティングシステムを起動するためにのみ使用されます。