kernel
and ラインのあるinitrd
ブートローダがあるとしましょう。すべての意図と目的のために、現在2〜3つの「カーネル」ステップに取り組んでいます。
- ファームウェア
- grub(または他のブートローダ)
- 実際のLinuxカーネル
上記はMBRについてです。 EFIの場合、ブートローダ(またはブートマネージャ)は、ファームウェアが「カーネル」のときに実行されるEFIアプリケーションです。
- ファームウェア、EFIアプリケーションをロード中
- 実際のLinuxカーネル
実際のカーネル切り替えプロセスは何ですか? MBRグラップは2から3に変更するか、EFIファームウェアを1から2に変更するために実際に何をしますか?と似ていますかkexec
?
第二に、EFIの場合、一部のフックはEFIアプリケーションに渡され、その後Linuxカーネルに渡されます(efibootmgrなどの操作を実行できます)。これはどのように渡されますか?
最後に、これを何度も実行できますか?たとえば、「一般」OSをロードする前にTPMエントリの測定と確認、復号化などの一部のカスタム操作を実行する必要がある場合は、grub、rEFInd、またはその他のツールを使用して簡単に実行できない操作が考えられます。 「一時」ステップカーネルとinitrdをロードして実行してから渡すことはできますか?
答え1
主にBIOS / GRUBシステムに関するいくつかの注意事項です。
GRUBを使用したBIOSシステム:
BIOS起動時間住所0xfffffff0
(x86).
POSTなど様々なテストを行います。すべてがうまくいったら、CMOSに設定され、保存された順序でデバイスを確認してください。有効なMBR(オフセット510の署名0x55aa
)を持つ最初のブートデバイスはアドレスメモリにロードされます0x7c00
。
その後、BIOSはMBRのオフセットからロードされたコード(バイト)に制御を渡します0
。つまり、制御外のデータはプロセッサ命令でなければなりません。プログラム。
たとえば、MBR画像を見ると、eb6390
最初のようなものが見つかります。これは2つの機械命令に変換されます。
eb63 => jump to 0x63 (offset 0x65 in MBR as count is from end of instruction)
90 => No Operation
boot.S
GRUBソースから。アセンブリMBRの最初のコマンドは次のとおりです。jmp LOCAL(after_BPB) nop
ここで、GRUBは次のステップをロードします。通常、最初のセクターcore.img
diskboot.S
通常のディスク起動時にGRUBソースから。
このコードに移動してロードしますcore.img
。これには、Reed-Solomonエラーの修正、解凍startup_raw.S
などが含まれます。現在、GRUBはモジュールに基づいており、モジュールもこの段階でロードされます。
GRUB構成ファイルを読み込んで実行するカーネルを決定したら、その/boot
ファイルをディレクトリからメモリにロードします。その後、初期RAMディスクイメージinitrd
がメモリにロードされます。
また、ブートローダは設定文字列のメモリアドレスをカーネルメモリ空間に書き込みます。つまり、起動オプションです。バラよりヘッダーフィールド目立つ「調整」。
さらに、ブートローダは通常、ロード段階でリアルモードと保護モードを交互に使用します。これにより、1MBの制限を超えるデータをロードできます。
これが完了すると、BIOSがMBRを介してブートローダに制御権を委任するのと同じように、ブートローダは制御権をカーネルに渡します。これはリアルモードで行われます。
カーネルは(通常)モジュールベースです。たとえば、これらのモジュールの中にはファイルシステムモジュールがあります。起動時にカーネルはファイルシステムからファイルを読み取る必要があるかもしれません。これを読むにはモジュールが必要です。これがまさにinitrd
これが働く部分です。起動に必要なモジュールはここにあります。
(有)EFI:
(U)EFIブートプロセスできるuefigrubのインストールなどを使用する場合は、BIOS/GRUBと同じトラックにあります。また、使用することを選択できますEFIブートスタブこれにより、EFIファームウェアはカーネルをEFI実行可能ファイルにロードできます。
もっと遠く、カーネル3.14から開始、kexec
も使用できますが、コールドスタートには使用できません。