このページの目次
Kbuild とモジュール
カバー範囲: Kconfig/Kbuild → Makefile 構文 → カーネルモジュールのコンパイル → 外部ツリーモジュール → モジュール署名 → EXPORT_SYMBOL → モジュールの読み込み カーネルバージョン: 2.6 ~ 6.x
Kbuild ビルドシステム
Kconfig: 設定項目
各サブディレクトリ: Kconfig ファイル → メニュー、オプション、依存関係を定義
→ make menuconfig/nconfig → Kconfig を読み込み → .config を生成
config エントリ:
config MY_FEATURE
tristate "My Feature" ← y(組み込み), m(モジュール), n(コンパイルしない)
depends on PCI
select CRC32
help
この機能は...
boolean: y/n
tristate: y/m/n
int/hex/string: 値
Kbuild Makefiles
# サブディレクトリの Makefile:
obj-y += core.o # カーネルに組み込む (CONFIG_XXX=y)
obj-m += driver.o # モジュールとしてコンパイル (CONFIG_XXX=m)
obj-$(CONFIG_MYDRV) += mydrv.o # config に応じて y/m/n を決定
# 複数ファイルのモジュール:
obj-m := mymod.o
mymod-objs := mod-main.o mod-helper.o
コンパイルフロー
カーネルモジュール
基本的な骨格
static int __init
static void __exit
;
;
;
;
;
モジュールの読み込み/アンロード
# 読み込まれているモジュールの確認
モジュールパラメータ
static int myparam = 42;
; // sysfs: /sys/module/mymod/parameters/myparam
// 使用方法: insmod mymodule.ko myparam=100
モジュール署名
// CONFIG_MODULE_SIG=y → コンパイル時にモジュールに署名
// カーネル起動時: 署名を検証 → 不一致 → 読み込み拒否 (sig_enforce=0 の場合を除く)
// UEFI Secure Boot: 署名検証を強制有効
// カーネルキーリング:
// .builtin_trusted_keys: コンパイル時に埋め込まれた鍵
// .secondary_trusted_keys: 実行時に追加 (builtin 署名が必要)
EXPORT_SYMBOL
// 記号 (関数/変数) を公開シンボルテーブルにエクスポート:
; // すべてのモジュールで利用可能
; // GPL モジュールのみ利用可能 (ライセンスチェック)
// 仕組み: コンパイル時に __ksymtab セクションに記号を記録 → モジュール読み込み時に解決
外部ツリーモジュールのビルド
# 外部モジュール用の Kbuild (カーネルツリー外):
obj-m := mydriver.o
KDIR := /lib/modules/$(shell )/build
PWD := $(shell )
:
:
参考
- ソースコード:
scripts/kconfig/,scripts/Makefile.*,kernel/module/ - カーネルドキュメント:
Documentation/kbuild/,Documentation/kbuild/modules.rst
キーワード: Kconfig, Kbuild, kernel module, EXPORT_SYMBOL, module param, module signing, out-of-tree