ARMプロセッサが組み込まれたボードで作業しています。起動するには、ブートローダー、Linuxカーネル、およびルートファイルシステムを含むディスクイメージを追加する必要があります。このディスクイメージターゲットボード(ZedBoard)用にインターネットで入手できます。
必要なすべてのドライバーをアクティブにしてカーネルをコンパイルした後、/ lib/modules/kernel_numberで多くのドライバーが利用可能であることがわかりました。
このすべてがどのように機能するかについて、私は少し混乱しています。ドライバーはカーネルによってロードされますか?もしそうなら、なぜそれらはすでにrootfsの一部なのですか?または、カーネルはそれらをコンパイルされたもので上書きしますか?
「ドライバー」と「モジュール」を区別する必要がありますが、これは非常に簡単です。 ドライバーはモジュールである場合とそうでない場合があります。そうでない場合は、ブートローダーによってロードされたカーネルに組み込まれます。
モジュールの場合は、_/lib/modules/[kernel-release]
_をルートとするファイルシステム階層にあります。1 このようなリポジトリを含む可能性のある小さな予備ルートファイルシステム(「initramfs」)と一緒にカーネルを起動することが可能であることに注意してください。これは汎用カーネルでは正常であるため、実際のファイルシステムにアクセスするためにロードする必要のあるモジュラードライバーを決定できます。これができない場合、モジュールにアクセスできないためです。
ドライバーはカーネルによってロードされますか?
はい。
もしそうなら、なぜそれらはすでにrootfsの一部なのですか?
ロードする前に他にどこに保存する必要がありますか?カーネルはそれ自体の中にrootfsを含んでおらず(WRTのいくつかの形式のinitramfsを除く)、それは単なるゲートキーパーです。
カーネルはそれらをコンパイルされたもので上書きしますか?
いいえ。ドライバをコンパイルする場合、カーネルはわざわざ_/lib/modules
_をチェックしません。とにかくそのようなドライバーをロードするように明示的に要求した場合、どうなるかはわかりません。
1.Celadaが$(uname -r)
で示唆しているように、このリリース文字列は必ずしもバージョン番号だけではありません。同じバージョンでリリース文字列が異なる複数のカーネルを使用できるため、モジュールストアが分離されます。同様に、同じリリース文字列、つまり同じモジュールストアを持つ複数のカーネルを持つことができます。
Linuxでは、ほとんどのドライバーをカーネルに静的に組み込むことも、モジュールとして組み込むこともできます。これは、カーネルがコンパイル用に構成されているときに行うことができる選択です。ロード可能なモジュールとして構築されている場合にのみ、/lib/modules/$(uname -r)
に表示されます。
通常、汎用システムの場合、特にLinuxディストリビューションの一部として利用できるようにコンパイルされたカーネルの場合、ドライバーの厳密な最小セットが静的に組み込まれ、可能な限りモジュールとして組み込まれます。これにより、各ユーザーのシステムは、モジュールが何であるかを事前に知らなくても、必要なモジュールのみをロードできます。
組み込みシステムのカーネルは、多くの場合、より多くのドライバーが組み込まれた状態で構築されます。カーネルは、非常に特殊な不変のハードウェアのセットを備えたシステム用に構築されており、システムインテグレーターはそれが何であるかを事前に知っているからです。それにもかかわらず、多くのドライバは、特にUSBデバイスのように存在する場合と存在しない場合がある「追加の」ハードウェアの場合、モジュールとしてロードするために残されることがよくあります。