web-dev-qa-db-ja.com

ブートローダーは実際にどのようにしてカーネルにハンドオフしますか?

kernelinitrdの行を持つブートローダーがあるとします。すべての意図と目的のために、私は現在、「カーネル」の2つまたは3つの段階が進行中です。

  1. ファームウェア
  2. grub(または他のブートローダー)
  3. 実際のLinuxカーネル

上記はMBRの場合です。 EFIの場合、ブートローダー(またはブートマネージャー)は、ファームウェアが「カーネル」である間に実行される単なるEFIアプリです。

  1. ファームウェア、EFIアプリをロードします
  2. 実際のLinuxカーネル

実際のカーネルハンドオフプロセスは何ですか。 MBR grubが2から3に移行するために、またはEFIファームウェアが1から2に移行するために、実際に何をしますか? kexecに似ていますか?

次に、いくつかのフックがEFIアプリに渡され、そこからLinuxカーネルに渡されるEFIの場合(efibootmgrなどを実行できるように)、それはどのように渡されますか?

最後に、それを複数回行うことは可能ですか?例えば。 「通常の」OSをロードする前に行う必要のあるカスタム作業がある場合。 TPMエントリ、復号化などの測定と検証、おそらくgrub、rEFIndなどを使用して簡単に実行できないことは、「中間」ステージのカーネルとinitrdをロードし、それらを実行してから渡すことができますか?

4
deitch

主にBIOS/GRUBシステムに関する注意事項。

GRUBを使用したBIOSシステム:

BIOSの開始元 アドレス0xfffffff0 (x86)。

さまざまなテストを行います。役職。問題がなければ、CMOSで構成および保存された順序でデバイスを確認します。有効なMBR(オフセット510の署名は0x55aa)を持つ最初のブートデバイスは、アドレス0x7c00のメモリにロードされます。

次に、BIOSは、オフセット0でMBRからロードされるコード(バイト)に制御を任せます。あれは;制御が残されているデータは、プロセッサ命令である必要があります。プログラム。

たとえば、MBR画像を見ると、最初にeb6390のようなものが見つかる可能性があります。これは、2つのマシン命令に変換されます。

eb63 => jump to 0x63 (offset 0x65 in MBR as count is from end of instruction)
90   => No Operation
  • GRUBソースのboot.S。アセンブリのMBRの最初の命令:

    jmp LOCAL(after_BPB)
    nop
    

ここからGRUB次のステージをロードします。通常、core.imgの最初のセクター

  • 通常のディスクブートのGRUBソースのdiskboot.S

このコードにジャンプし、残りのcore.imgをロードします。これには、たとえば、リードソロモンエラー訂正、解凍などが含まれます。 startup_raw.S。現在のGRUBはモジュールベースであり、これらもこの段階でロードされます。

GRUB構成ファイルが読み取られるなど、実行するカーネルが決定されると、それが/bootディレクトリからメモリにロードされます。次に最初のRAMディスクイメージinitrdがメモリにロードされます。

ブートローダーは、構成文字列のメモリアドレスもカーネルのメモリ空間に書き込みます。つまりブートオプション。 header fields mark "modify" を参照してください。

また、ブートローダーは通常、ロード段階で実際のモードと保護されたモードを交互に繰り返すことに注意してください。これは、1MBの制限を超えてデータをロードできるようにするためです。

これが行われると、BIOSがMBRを介してブートローダーに制御を任せたように、ブートローダーはカーネルに制御を任せます。これはリアルモードで行われます。

カーネルは(通常)モジュールベースです。モジュールの中には、たとえばファイルシステムモジュールがあります。起動時に、カーネルはファイルシステムからファイルを読み取らなければならない可能性があり、読み取るにはモジュールが必要です…ここでinitrdが機能します。開始するために必要なモジュールはここにあります。

(U)EFI

(U)EFIブートプロセス can は、uefigrubインストールなどを使用する場合、BIOS/GRUBとほぼ同じトラックに進むことができます。 を使用するオプションもあります。 EFIブートスタブ これにより、EFIファームウェアはカーネルをEFI実行可能ファイルとしてロードできます。

さらに、 カーネル3.14以降kexecも利用できますが、コールドブートを目的としたものではありません。

2
Runium