Linuxドライバはカーネルまたはrootfsの一部ですか?

Linuxドライバはカーネルまたはrootfsの一部ですか?

私は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デバイスなど)の場合、モジュールとしてロードされることがよくあります。

関連情報