組み込みカーネルモジュールはどこにありますか?

組み込みカーネルモジュールはどこにありますか?

組み込みカーネルモジュールがどのように機能するのか混乱しています。私が理解したように、LinuxカーネルをコンパイルするときにkconfigオプションをMODULE_NAME=y。たとえば、ロードする必要はありませんmodprobe。内蔵カーネルモジュールを使用できますcat /lib/modules/$(uname -r)/modules.builtin

このコマンドを実行すると、リストに.koファイルが表示されます。しかし、カーネルに組み込まれている場合、これはなぜ表示されますか?たとえば、

~$ cat /lib/modules/$(uname -r)/modules.builtin | grep -i bsg    #just picking something random
kernel/block/bsg.ko

~$ cat /boot/config-6.5.0-14-generic | grep -i bsg
CONFIG_BLK_DEV_BSG_COMMON=y    #implying this is a builtin module
CONFIG_BLK_DEV_BSGLIB=y
CONFIG_BLK_DEV_BSG=y
CONFIG_SCSI_UFS_BSG=y


~$ modinfo bsg
name:           bsg
filename:       (builtin)
license:        GPL
file:           block/bsg    #why "file"? Isn't it compiled inside the kernel?
...

~$ cat /lib/modules/6.5.0-14-generic/kernel/block/bsg.ko
cat: /lib/modules/6.5.0-14-generic/kernel/block/bsg.ko: No such file or directory

だから私の質問は次のようになります

  • 組み込みカーネルモジュールは正確にどのようになり、システム内のどこにありますか?
  • vmlinuz内にあり、何とか抽出されますか?
  • ファイルとして表示されますが、.ko予期したディレクトリに存在しないのはなぜですか?

実際にvmlinu(x / z)に組み込まれていることを考えると、どのように「登録」されてを使用して見つけることができますかmodinfo?カーネルバイナリにある場合、modinfoが示すように、ファイル(ブロック/ bsg)がまだあるのはなぜですか?

答え1

組み込みカーネル「モジュール」(実際のモジュールではない)は、圧縮される前のデフォルトのvmlinuxカーネルバイナリの一部です。これらは別々のエンティティに抽出されませんが、残りのカーネルと共にロードされます。

他のツールでより使いやすくするためにファイルとして.ko提供されています。modules.builtin例えばモジュール依存性の分析に使用されます。ファイルとしてリストすると、モジュールの.koように扱うことができます。

カーネルコンポーネントが組み込まれていてソースファイルにモジュール宣言が含まれている場合、提供された情報はおよびmodules.builtinに保存されますmodules.builtin.modinfo(参照:Kbuild ドキュメント)。内蔵モジュールのロード要求を処理し、modules.builtinそれに関する情報を提供できます。組み込みコンポーネントはありません。modprobemodules.builtin.modinfomodinfoファイル名(ロード可能なモジュールの場合、これはディスクの実際のコンテンツを指します.ko)しかし、ファイルがあります。これはモジュール名を格納する組み込みモジュール固有のエントリです。源泉モジュール宣言を含むファイル(block/bsg.cあなたの例では)。

関連情報