組み込みカーネルモジュールがどのように機能するのか混乱しています。私が理解したように、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
それに関する情報を提供できます。組み込みコンポーネントはありません。modprobe
modules.builtin.modinfo
modinfo
ファイル名(ロード可能なモジュールの場合、これはディスクの実際のコンテンツを指します.ko
)しかし、ファイルがあります。これはモジュール名を格納する組み込みモジュール固有のエントリです。源泉モジュール宣言を含むファイル(block/bsg.c
あなたの例では)。