kernel
とinitrd
の行を持つブートローダーがあるとします。すべての意図と目的のために、私は現在、「カーネル」の2つまたは3つの段階が進行中です。
上記はMBRの場合です。 EFIの場合、ブートローダー(またはブートマネージャー)は、ファームウェアが「カーネル」である間に実行される単なるEFIアプリです。
実際のカーネルハンドオフプロセスは何ですか。 MBR grubが2から3に移行するために、またはEFIファームウェアが1から2に移行するために、実際に何をしますか? kexec
に似ていますか?
次に、いくつかのフックがEFIアプリに渡され、そこからLinuxカーネルに渡されるEFIの場合(efibootmgrなどを実行できるように)、それはどのように渡されますか?
最後に、それを複数回行うことは可能ですか?例えば。 「通常の」OSをロードする前に行う必要のあるカスタム作業がある場合。 TPMエントリ、復号化などの測定と検証、おそらくgrub、rEFIndなどを使用して簡単に実行できないことは、「中間」ステージのカーネルとinitrdをロードし、それらを実行してから渡すことができますか?
主にBIOS/GRUBシステムに関する注意事項。
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
の最初のセクター
diskboot.S
。このコードにジャンプし、残りのcore.img
をロードします。これには、たとえば、リードソロモンエラー訂正、解凍などが含まれます。 startup_raw.S
。現在のGRUBはモジュールベースであり、これらもこの段階でロードされます。
GRUB構成ファイルが読み取られるなど、実行するカーネルが決定されると、それが/boot
ディレクトリからメモリにロードされます。次に最初のRAMディスクイメージinitrd
がメモリにロードされます。
ブートローダーは、構成文字列のメモリアドレスもカーネルのメモリ空間に書き込みます。つまりブートオプション。 header fields mark "modify" を参照してください。
また、ブートローダーは通常、ロード段階で実際のモードと保護されたモードを交互に繰り返すことに注意してください。これは、1MBの制限を超えてデータをロードできるようにするためです。
これが行われると、BIOSがMBRを介してブートローダーに制御を任せたように、ブートローダーはカーネルに制御を任せます。これはリアルモードで行われます。
カーネルは(通常)モジュールベースです。モジュールの中には、たとえばファイルシステムモジュールがあります。起動時に、カーネルはファイルシステムからファイルを読み取らなければならない可能性があり、読み取るにはモジュールが必要です…ここでinitrd
が機能します。開始するために必要なモジュールはここにあります。
(U)EFIブートプロセス can は、uefigrubインストールなどを使用する場合、BIOS/GRUBとほぼ同じトラックに進むことができます。 を使用するオプションもあります。 EFIブートスタブ これにより、EFIファームウェアはカーネルをEFI実行可能ファイルとしてロードできます。
さらに、 カーネル3.14以降 、kexec
も利用できますが、コールドブートを目的としたものではありません。