私はARMプロセッサを内蔵したマザーボードを開発してきました。起動するには、ブートローダ、Linuxカーネル、およびルートファイルシステムを含むディスクイメージを追加する必要がありました。このディスクイメージは、ターゲットボード(ZedBoard)についてインターネット上で見つけることができます。
カーネルをコンパイルし、必要なすべてのドライバを有効にした後、/lib/modules/kernel_numberで多くのドライバを使用できることがわかりました。
全体の仕事がどのように機能するか少し混乱しています。ドライバはカーネルによってロードされますか?それでは、なぜすでにrootfsの一部ですか?それともカーネルはその中にコンパイルされた内容で上書きされますか?
答え1
「ドライバ」と「モジュール」を区別する必要がありますが、非常に簡単です。 ドライバはモジュールであってもなくてもよい。 それ以外の場合は、ブートローダがロードしたカーネルにビルドされます。
モジュールの場合は、ルートのファイルシステム階層にあります/lib/modules/[kernel-release]
。1 カーネルは、これらのリポジトリを含むことができる小さな予備のルートファイルシステム(「initramfs」)で起動できます。これは通常のカーネルにとって一般的な現象であるため、物理ファイルシステムにアクセスするためにロードする必要があるモジュラードライバを決定できます。そうしないと、そこにあるどのモジュールにもアクセスできないからです。
ドライバはカーネルによってロードされますか?
はい。
それでは、なぜすでにrootfsの一部ですか?
ロードする前にどこに保管する必要がありますか?カーネル自体にはrootfsが含まれておらず(WRTの一部の形式のinitramfsを除く)、これはゲートキーパーにすぎません。
カーネルはその中にコンパイルされた内容で上書きされますか?
習慣。ドライバをコンパイルすると、カーネルは/lib/modules
それを確認しません。そのようなドライバをロードするように明示的に要求すると、何が起こるのかわかりません。おそらくちょうどいいえと答えるでしょう。
1. Celadaが示唆したように、$(uname -r)
このバージョン文字列は必ずしもバージョン番号である必要はありません。バージョンは同じで、バージョン文字列は異なる複数のコアを持つことができるため、別々のモジュールリポジトリを使用できます。同様に、同じリリース文字列を使用して、同じモジュールリポジトリを持つ複数のコアを持つことができます。
答え2
Linuxでは、ほとんどのドライバをカーネルに静的に構築したり、モジュールとして構築したりできます。これは、コンパイル用にカーネルを設定するときに選択できます。/lib/modules/$(uname -r)
ロード可能なモジュールとしてビルドされている場合にのみ表示されます。
一般に、汎用システム、特にLinuxディストリビューションの一部として提供されるプリコンパイルされたカーネルでは、厳密な最小ドライバセットが静的に構築され、可能であればモジュールとして構築されます。これにより、各ユーザーのシステムは、事前にモジュールが何であるかを知らずに、必要なモジュールのみをロードできます。
組み込みシステムにはカーネルに多くのドライバが組み込まれていることがよくあります。カーネルは非常に特定の不変ハードウェアセットを持つシステム用に構築されており、システムインテグレータはそれが何であるかを事前に知っているからです。ただし、多くのドライバは、特に存在する場合と存在しない場合がある「追加」ハードウェア(USBデバイスなど)の場合、モジュールとしてロードされることがよくあります。