電源ボタンを押したときから、マシン全体の起動プロセスを理解しようとしています。ブートローダーからinitramfsステージまで、この1つの部分がありますが、他の小さなビットの中でもよくわかりません。
最近の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
s、set root
、およびsearch
ですが、これはGrubの観点からのものであり、カーネルとは共有されていません。
また、Grubがカーネルの(コピー?)をメモリにロード( linux
コマンド )し、実行を開始するためにキックしていると推測しています。 (2つの異なるステップは明らかに-そう、どのように?)与えられたパラメーターはカーネルで読み取られ、解釈され(これはどこかのメモリにマップされた大きな文字列ですか?)、要求されたものを配置するオプションを提供します。
このinitrd
オプションも表示されます。これは、root=
で指定された実際のルートデバイスを起動するために必要なgzip圧縮されたinitramfsを指します。しかし、このinitramfsはどのようにカーネルに提供されますか?カーネルが起動する前にすでにロードされているため、ロードできる場所にメモリアドレスが渡されることも、それ自体にアクセスすることもできません。一部のカーネルドキュメントには、このinitramfsファイルシステムの「デバイス」は/dev/ram0
からアクセスできると記載されていますが、そもそもアクセス可能なデバイスファイルになる方法がわかりません。見えない水中で何かが起こっていると思います。
また、これが、たとえばU-boot/Corebootを使用する組み込みプラットフォームを含む、他のブートローダーとどのように関連しているかわかりません。これはGrubと同じことをしていますか(同じ標準メモリアドレスですか?)、カーネル/ initrdのロードに関してこれらはGrubとどの程度比較されますか?
私の質問を明確にするために、なぜ異なるブートステージが存在し、what遷移が発生するのかは理解していると思いますが、どのようにそれらが行われ、各段階に対する正確な責任は何ですか。私は、これがすべてに帰着するいくつかの「標準」を見逃しているような気がします。
これについて説明をいただければ幸いです。
通常、ファイルをメモリにロードして特定の場所にジャンプするだけでは不十分であるため、一般に何らかのプロトコルが必要ですが、カーネルパラメータなどの追加の引数を渡す必要があります。つまり、 memdisk引数にアクセスするDOS 。
これはハードウェアに依存するため(たとえば、armはx86とは異なります)、正しい情報を見つける必要があります。 armの起動に関するこの記事 または Linux/x86ブートプロトコル を参照してください。いくつかの例。