3.11. カスタムカーネルモジュールのコンパイル
ハードウェアおよびソフトウェアレベルで、さまざまな設定による要求に応じて、サンプリングカーネルモジュールを構築できます。
前提条件
kernel-develパッケージ、gccパッケージ、およびelfutils-libelf-develパッケージをインストールしている。# *dnf install kernel-devel-$(uname -r) gcc elfutils-libelf-devel*- root 権限がある。
-
カスタムカーネルモジュールをコンパイルする
/root/testmodule/ディレクトリーを作成している。
手順
以下の内容で
/root/testmodule/test.cを作成します。#include <linux/module.h> #include <linux/kernel.h> int init_module(void) { printk("Hello World\n This is a test\n"); return 0; } void cleanup_module(void) { printk("Good Bye World"); } MODULE_LICENSE("GPL");test.cファイルは、カーネルモジュールに主な機能を提供するソースファイルです。このファイルは、組織的な目的で、専用の/root/testmodule/ディレクトリーに作成されています。モジュールをコンパイルすると、/root/testmodule/ディレクトリーには複数のファイルが含まれます。test.cファイルには、システムライブラリーから次のものが含まれます。-
サンプルコードの
printk()機能には、linux/kernel.hヘッダーファイルが必要です。 -
linux/module.hファイルには、C プログラミング言語で記述された複数のソースファイル間で共有される関数宣言とマクロ定義が含まれています。
-
サンプルコードの
-
次に、
init_module()関数およびcleanup_module()関数に従い、テキストを出力するカーネルロギング機能printk()を起動および終了します。 以下の内容で
/root/testmodule/Makefileを作成します。obj-m := test.oMakefile には、コンパイラーが
test.oという名前のオブジェクトファイルを生成するための指示が含まれています。obj-mディレクティブは、生成されるtest.koファイルを、読み込み可能なカーネルモジュールとしてコンパイルすることを指定します。あるいは、obj-yディレクティブは、組み込みカーネルモジュールとしてtest.koをビルドするように指示できます。カーネルモジュールをコンパイルします。
# make -C /lib/modules/$(uname -r)/build M=/root/testmodule modules make: Entering directory '/usr/src/kernels/6.12.0-55.9.1.el10_0.x86_64' CC [M] /root/testmodule/test.o MODPOST /root/testmodule/Module.symvers CC [M] /root/testmodule/test.mod.o LD [M] /root/testmodule/test.ko BTF [M] /root/testmodule/test.ko Skipping BTF generation for /root/testmodule/test.ko due to unavailability of vmlinux make: Leaving directory '/usr/src/kernels/6.12.0-55.9.1.el10_0.x86_64'コンパイラーは、各ソースファイル (
test.c) のオブジェクトファイル (test.o) を中間手順として作成してから、それらを最終カーネルモジュール (test.ko) にリンクします。コンパイルが成功すると、
/root/testmodule/には、コンパイル済みカスタムカーネルモジュールに関連する追加ファイルが含まれます。コンパイル済みモジュール自身は、test.koファイルで表されます。
検証
必要に応じて、
/root/testmodule/ディレクトリーのコンテンツを確認します。# ls -l /root/testmodule/ total 152 -rw-r—r--. 1 root root 16 Jul 26 08:19 Makefile -rw-r—r--. 1 root root 25 Jul 26 08:20 modules.order -rw-r—r--. 1 root root 0 Jul 26 08:20 Module.symvers -rw-r—r--. 1 root root 224 Jul 26 08:18 test.c -rw-r—r--. 1 root root 62176 Jul 26 08:20 test.ko -rw-r—r--. 1 root root 25 Jul 26 08:20 test.mod -rw-r—r--. 1 root root 849 Jul 26 08:20 test.mod.c -rw-r—r--. 1 root root 50936 Jul 26 08:20 test.mod.o -rw-r—r--. 1 root root 12912 Jul 26 08:20 test.oカーネルモジュールを
/lib/modules/$(uname -r)/ディレクトリーにコピーします。# cp /root/testmodule/test.ko /lib/modules/$(uname -r)/モジュールの依存関係のリストを更新します。
# depmod -aカーネルモジュールを読み込みます。
# modprobe -v test insmod /lib/modules/6.12.0-55.9.1.el10_0.x86_64/test.koカーネルモジュールが正常に読み込まれたことを確認します。
# lsmod | grep test test 16384 0カーネルリングバッファーから最新のメッセージを読み込みます。
# dmesg [74422.545004] Hello World This is a test