Linuxカーネルは、割り当てられたinitramfs / initrdにどのようにアクセスできますか?


8

電源ボタンを押してからマシン全体の起動プロセスを理解しようとしています。ブートローダーから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がカーネルのカーネルにコピー(コピー?)を読み込んで(linuxcommand)、キックして実行を開始していると推測しています。(2つの異なるステップ-どうやって、どうやって?)

このinitrdオプションも表示されます。これは、で指定された実際のルートデバイスを起動するために必要なgzip圧縮されたinitramfsを指しますroot=。しかし、このinitramfsはカーネルにどのように提供されますか?カーネルが起動する前にすでにロードされているため、ロードできる場所にメモリアドレスが渡されることはなく、それ自体にアクセスすることもできません。一部のカーネルのドキュメントでは、このinitramfsファイルシステム「デバイス」にからアクセスできる/dev/ram0と記載されていますが、それがどのようにして最初からアクセス可能なデバイスファイルになるかわかりません。見えない水中で何かが起こっていると思います。

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

私の質問を明確にするために、私はさまざまなブートステージが存在する理由とどのような移行が行われるのかを理解していると思いますが、それらがどのように行われるか、および各ステージに対する正確な責任はわかりません。私はこれがすべての「標準」に欠けていると感じています。

これについていくつか説明をいただければ幸いです。


bootシーケンスの最後にある暗黙のコマンドに注意してください。私はそれがGrubで何をするか正確にはわかりませんが、Grubコマンドラインを使用してこれらのコマンドを手動で入力する場合、あなたはそうする必要があります、bootまたはそれは永遠にgrub>(または少なくとも、退屈してコンピューターの電源を切るまで) )。上記のコマンドは「単に」環境をセットアップします。
CVn

@MichaelKjörling私の理解から、bootCPUはロードされたカーネルのアドレスにジャンプします(実行を開始します)。メニューエントリの場合、これは暗黙的に定義されています。参照これを
gertvdijk

回答:


5

一般に、ファイルをメモリにロードして特定の場所にジャンプするだけでは不十分なので、何らかのプロトコルが必要ですが、カーネルパラメータなどの追加の引数を渡す必要があります。つまり、DOSからmemdisk引数にアクセスします。

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


6

ブートローダーはinitrdをメモリ内の場所に格納し、initrdイメージのメモリアドレスをカーネルに通知します。最近のほとんどのLinuxシステムでは、dracutを使用するinitramfsスキームを使用しています。これは、実際には(ディスクイメージではなく)cpioアーカイブであり、実行直後にカーネルによって作成されたtmpfsファイルシステムに解凍されます。


私はそこまで来ました。しかし、ブートローダーはどのようにメモリ内の場所をカーネルに伝えますか?カーネルはそのメモリアドレスをどこで取得しますか?
gertvdijk

3
@gertvdijkはkernel.org/doc/Documentation/x86/boot.txtを参照してください。これは、ブートローダーがカーネルと通信する方法を説明します。つまり、ブートローダーはカーネルパラメータなども提供する必要があります。
Ulrich Dangel

@UlrichDangelいいね!まさに私が探していたもの。どうやら、それはすべてを説明するハードウェア固有の(この場合はx86)プロトコルです。簡単な説明を付けて回答として書いてください。受け入れます。
gertvdijk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.