web-dev-qa-db-ja.com

どのデバイスドライバーがカーネルに組み込まれていますか?

最近、ベンダーが提供する組み込みLinuxをハードウェアデバイスにインストールしました。デバイスのコマンドラインでlsmodを実行すると、応答が空でした。これは、デバイスで実行されているハードウェアのドライバーが.koファイルとしてではなく、カーネルに組み込まれていることを意味すると信じるようになりました。私の質問はこれです:このプロセスはどのように起こるのですか?

人気のあるハードウェアのサポートは、その後のバージョンでカーネルに徐々に統合され、.koファイルが置き換えられますか? .koファイルは、リリース時点でカーネル統合ドライバーをサポートしていない新しいハードウェアをサポートするためだけに使用されていますか?私の限られた知識では、すべてのハードウェアドライバーは.koファイルの形式であると考えましたが、明らかにこれは間違っています。

私は全体のプロセスに少し混乱していますが、状況を間違った方向で見ているかもしれないと感じているので、明確化に感謝します。

14

カーネルのロードに不可欠と考えられるコアドライバーは通常カーネルに組み込まれますが、他のハードウェアドライバーなどはモジュールまたは。koファイルとして組み込まれます。

。koモジュールは通常、ルートパーティションの/libディレクトリの下に保存されます。これらのいずれかを使用するには、カーネルが最初に基礎となるストレージデバイスを検出してアクセスし、次にそのファイルシステムにアクセスできる必要があります。そのため、SATA/SCSIおよびext2/3/4をサポートしないカーネルが組み込まれているカーネルは、実際には起動しないと想定しても安全です;)

ほとんどの組み込みカーネルドライバーをモジュール形式に切り替えることを選択できます。 Ubuntuカーネルチームは、Linuxカーネルチームのデフォルト構成を変更し、ダウンロードするストックカーネルイメージの追加の組み込みドライバーを含める/除外するかどうかを決定します。

独自のカーネルを構築する場合、同じことができます:

enter image description here

  • 上記のスクリーンショットでは、*は組み込みドライバーを示し、Mはモジュールを示します。
  • ループバックデバイスのサポートは、多くの場合システムの起動に不可欠ですが、デフォルトで組み込まれています。
  • 低速USBドライバー(USB 1.0)もデフォルトで組み込まれているため、USBスティックから起動できますが、ここではモジュールに変更しました。
10
ish

カーネル をコンパイルすると、どのコンポーネントがインストールされているかconfigureに到達します。それだけでなく、カーネルに組み込まれるかどうか、またはmoduleであるかどうかを選択できます。

たとえば、多くの人が/ bootパーティションでext2ファイルシステムを使用しています。このため、カーネルはブート時にext2ファイルシステムを読み取れる必要があります。これを実現するために、ext2モジュールはカーネル自体に組み込まれています。

次に、使用可能なモジュールの量を想像してください。それらをすべてカーネルに組み込むのは意味がありませんか?これが、これらを個別の。koモジュールとしてビルドし、自由にロードできる理由です。

3
earthmeLon

これらは、Linuxカーネルのビルドをどのように構成したかによって異なります。

通常、コンパイルプロセスでは次のことができます。

  • モジュールのサポートの有無にかかわらずカーネルをコンパイルします(多くの場合、モジュールのサポートが付属しています)
  • ドライバーをモジュールとして、または組み込みのソフトウェアとしてカーネルに直接コンパイルします

.koファイルの目的を理解する https://stackoverflow.com/questions/10476990/difference-between-o-and-ko-file

lsmodに空の出力がある理由は、モノリシックカーネルがあるためです。

すべてのモジュール(存在する場合)を一覧表示する簡単な方法は、このコマンドを実行することです

find /lib/modules/*/ -type f -iname '*.ko' | less

lessの使用に注意してください。必要なすべてのページャーを使用するか、出力を目的の場所にリダイレクトできます。

1
user827992
ls /sys/module

すべての組み込みモジュールと外部モジュールが含まれているようです。

しかし、実際にはモジュールではないエントリもいくつか含まれているようです: https://unix.stackexchange.com/questions/225706/are-modules-listed-under-sys-module-all-the-loaded-モジュール

TODO:ソースを読み、そこに何が置かれるかをより正確に理解します。

この方法の利点は、/bootまたは/proc/config.gzの下でカーネル構成を見つけることができることに依存しないことです。

ファイルの内容を参照してください/ lib/modules/$(uname -r)/modules.builtin

例えば特定のモジュールを検索するには

grep <module> /lib/modules/$(uname -r)/modules.builtin

Documentation/kbuild/kbuild.txt

modules.builtin
--------------------------------------------------
This file lists all modules that are built into the kernel. This is used
by modprobe to not fail when trying to load something builtin.
0
Andrew