Linuxカーネルは指定されたinitramfs / initrdにどのようにアクセスしますか?

Linuxカーネルは指定されたinitramfs / initrdにどのようにアクセスしますか?

電源ボタンを押すことから、マシン全体の起動プロセスを理解しようとしています。ブートローダからinitramfsステップまで、私がよく理解していない他の小さな部分もあります。

最近、Ubuntuの基本インストールからインポートされたエントリのGrub構成を考えると、次のようになります。

insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo    'Loading Linux x.y.z ...'
linux   /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset 
echo    'Loading initial ramdisk ...'
initrd  /initrd.img-x.y.z

これは実際にシステムの状態とメモリにどのような影響を与えますか?私はGrubの使命が「カーネルをロードして実行する」ことであり、デバイス(またはネットワーク)のファイルにアクセスしてそれをインポートする独自のモジュールセットを持っていることを知っています。ここのinsmod例では、set root-searchしかし、これはGrubの観点にすぎず、カーネルと共有されません。そうですか?

私はまた、Grubがカーネル(コピー?)をメモリにロードしていると推測します(linux注文する) 実行に入ります。 (明らかに2つの異なるステップ - だから、どのように?)与えられた引数はカーネルから読み取って解釈することができます(これはメモリのどこかにマップされた大きな文字列ですか?)、要求されたオプションをソートする方法を提供します。

initrdこのオプションも表示されます。これは、指定された物理ルートデバイスを起動するために必要なgzipped initramfsを指しますroot=。しかし、このinitramfsはどのようにカーネルに提供されますか?ロードできるメモリアドレスを渡さず、カーネルが起動する前にロードされるため、それ自体はアクセスできません。一部のカーネル文書では、このinitramfsファイルシステム「デバイス」がアクセス可能であることが示されていますが、どのように/dev/ram0これがアクセス可能なデバイスファイルになるのかわかりません。水の中には私が見られないことが起きているようです。

また、これがU-boot / Corebootの使用などの他のブートローダ(組み込みプラットフォームを含む)とどのように関連しているのかわかりません。 Grubと同じことをしますか(同じ標準メモリアドレス?)?カーネル/initrdロードの面でGrubとどのように比較されますか?

私の質問を明確にするために開始段階が異なる理由と変身しましたが見えません。どのようにどのように発生し、各段階の正確な責任は何ですか?私は「標準」を見逃しているという感じを持っており、すべてがこれに帰結します。

これについての説明がありますように。

答え1

ブートローダは initrd をメモリのどこかに保存し、カーネルに initrd イメージのメモリアドレスを通知します。ほとんどの最新のLinuxシステムでは、ファイルシステムの初期化スキームの使い方デラクールこれは、実際に実行した直後にカーネルによって生成されたtmpfsファイルシステムに解凍されたcpioアーカイブ(ディスクイメージではありません)です。

答え2

通常、ファイルをメモリにロードして特定の場所にジャンプするだけでは十分ではないため、一種のプロトコルが必要ですが、カーネルパラメータなどの他のパラメータを渡す必要があります。DOSからメモリディスクパラメータにアクセスする

これはハードウェアによって異なります(たとえば、armはx86とは異なります)、正しい情報を見つける必要があります。ガイドアームに関するこの記事またはLinux/x86 ブートプロトコルいくつかの例を見てください。

関連情報