GNU/Linux >> Linux の 問題 >  >> Linux

Linux は「initrd」イメージをどのようにロードしますか?

ナイファー、私はあなたの質問に答えようとしますが、ブート プロセスのより包括的な説明については、IBM のこの記事を試してください。

わかりました、説明のために GRUB または GRUB2 をブートローダーとして使用していると思います。まず、BIOS がディスクにアクセスしてブートローダーをロードするとき、有名な 13h 割り込みに格納されているディスク アクセス用の組み込みルーチンを使用します。ブートローダー (およびセットアップ段階のカーネル) は、ディスクにアクセスするときにこれらのルーチンを利用します。 BIOS はプロセッサのリアル モード (16 ビット モード) で実行されるため、RAM の 2^20 バイトを超えるアドレスを指定できないことに注意してください (リアル モードの各アドレスは segment_address* で構成されるため、2^16 ではなく 2^20)。 16 + オフセット。セグメント アドレスとオフセットの両方が 16 ビットです。ウィキペディアの「x86 メモリ セグメンテーション」を参照してください)。したがって、これらのルーチンは 1MiB を超える RAM にアクセスできません。これは厳密な制限であり、大きな不便です。

BIOS は MBR (ディスクの最初の 512 バイト) から直接ブートローダー コードをロードし、それを実行します。 GRUB を使用している場合、そのコードは GRUB ステージ 1 です。このコードは、DOS 互換領域と呼ばれるディスク領域の最初の 32KiB か、ファイル システムの固定アドレスにある GRUB ステージ 1.5 をロードします。これを行うためにファイル システム構造を理解する必要はありません。ステージ 1.5 がファイル システムにある場合でも、それは「生の」コードであり、RAM に直接ロードして実行できるためです。「PC 上の GRUB の詳細」を参照してください。下の画像のソースである pixelbeat.org の "。ディスクから RAM へのステージ 1.5 のロードは、BIOS ディスク アクセス ルーチンを利用します。

Stage1.5 にはファイルシステム ユーティリティが含まれているため、ファイルシステムからステージ 2 を読み取ることができます (ディスクから RAM への読み取りにはまだ BIOS 13h を使用しますが、i ノードなどに関するファイルシステム情報を解読し、生コードを取得できるようになりました)。ディスクから)。古い BIOS は、ディスク アドレッシング モードの制限により、HD 全体にアクセスできない場合があります。それらは、ディスク領域の最初の 8GiB を超えるアドレスを指定できない Cylinder-Head-Sector システムを使用している可能性があります:http://en.wikipedia. org/wiki/Cylinder-head-sector.

ステージ 2 カーネルをロード RAMに(これもBIOSディスクユーティリティを使用して)。 2.6+ カーネルの場合、initramfs もコンパイルされているため、ロードする必要はありません。古いカーネルの場合、ブートローダーはスタンドアロンの initrd イメージもメモリにロードするため、カーネルはそれをマウントし、ディスクから実際のファイル システムをマウントするためのドライバーを取得できます。

問題は、カーネル (および ramdisk) の重量が 1MiB を超えることです。したがって、それらを RAM にロードするには、カーネルを最初の 1MiB にロードしてから、保護モード (32 ビット) にジャンプし、ロードしたカーネルを上位メモリに移動し (最初の 1MiB をリアルモード用に解放)、リターンする必要があります。再びリアル (16 ビット) モードに切り替え、ディスクから最初の 1MiB まで RAM ディスクを取得し (別の initrd と古いカーネルの場合)、保護 (32 ビット) モードに再度切り替え、それが属する場所に配置し、場合によっては取得しますリアル モードに戻り (またはそうでない場合:https://stackoverflow.com/questions/4821911/does-grub-switch-to-protected-mode)、カーネル コードを実行します。警告:説明のこの部分の完全性と正確性については完全には確信が持てません.

ここで、最終的にカーネルを実行すると、カーネルと RAM ディスクがブートローダーによって RAM に読み込まれます であるため、カーネルは ramdisk のディスク ユーティリティを使用して、実際のルート ファイル システムをマウントし、そこにルートをピボットできます。 ramfs ドライバーはカーネル内に存在するため、もちろん initramfs の内容を理解できます。


Linux
  1. LinuxでディスクがSSDかHDDかを確認する方法

  2. Linux – Linuxカーネルはどのようにしてデバイスのメジャー番号とマイナー番号を認識しますか?

  3. Linux – Vmlinuxヘッダーにはカーネルイメージの長さが含まれていますか?

  1. Linux –どのモジュールがカーネルを汚染しているかを判断する方法は?

  2. 「ls」コマンドは Linux/Unix でどのように機能しますか?

  3. initrd イメージを作成せずに Linux カーネルを起動することはできますか?

  1. Linux カーネルの copy_from_user は内部でどのように機能しますか?

  2. Linux カーネルは __init 呼び出しの順序をどのように決定しますか?

  3. Linux カーネルをコンパイルするには、どのくらいのサイズが必要ですか?