私は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)
このバージョン文字列は必ずしもバージョン番号である必要はありません。バージョンは同じで、バージョン文字列は異なる複数のコアを持つことができるため、別々のモジュールリポジトリを使用できます。同様に、同じリリース文字列を使用して、同じモジュールリポジトリを持つ複数のコアを持つことができます。