前書き
過去の記事(環境構築: Linux Kernelモジュールの作成準備)では、
- Linux Kernelソースコード
- 自作Kernelモジュール
を分離して管理していました。ディレクトリ構成は、以下のような状態です。
Current directory
├── linux-source-4.9 # Linux Kernelソースコード
└── org_module # 自作Kernelモジュール
この構成では、自作KernelモジュールおよびLinux Kernelソースコードを同時にビルドできません。そこで、本記事では、自作Kernelモジュールをlinux-source-4.9の中に移動させ、Kernelルートディレクトリ(linux-source-4.9)にあるMakefileから自作Kernelモジュールをビルドする方法を示します。
検証環境
検証環境は、Debian10(buster)で実施します。本記事では、既存のKernelモジュールを利用して、手順を説明します。自作Kernelモジュールを0ベースで作成したい方は、以下の過去記事も合わせて確認して下さい。
$ neofetch
_,met$$$$$gg. nao@debian
,g$$$$$$$$$$$$$$$P. ----------
,g$$P" """Y$$.". OS: Debian GNU/Linux 10 (buster) x86_64
,$$P' `$$$. Kernel: 4.19.0-5-amd64
',$$P ,ggs. `$$b: Uptime: 15 hours, 4 minutes
`d$$' ,$P"' . $$$ Packages: 2466 (dpkg)
$$P d$' , $$P Shell: fish 3.0.2
$$: $$. - ,d$$' Resolution: 2560x1080
$$; Y$b._ _,d$P' DE: Cinnamon 3.8.8
Y$$. `.`"Y$$$$P"' WM: Mutter (Muffin)
`$$b "-.__ WM Theme: cinnamon (Albatross)
`Y$$ Theme: BlackMATE [GTK2/3]
`Y$$. Icons: gnome [GTK2/3]
`$$b. Terminal: gnome-terminal
`Y$$b. CPU: Intel i3-6100U (4) @ 2.300GHz
`"Y$b._ GPU: Intel HD Graphics 520
`""" Memory: 2918MiB / 32060MiB
Linux Kernelのビルドに必要なパッケージのinstall
Linux Kernelのビルド時に必要なパッケージをinstallします。以下の手順は、Debian前提です。
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install gawk wget git diffstat unzip texinfo gcc-multilib \
build-essential chrpath socat libsdl1.2-dev xterm libncurses5-dev \
lzop flex libelf-dev kmod
Linux KernelソースおよびKernelモジュールの取得
Linux KernelソースコードおよびKernelモジュールを取得します。aptコマンドで取得したLinux Kernelソースコードは、/usr/src以下にtarballで格納されます。具体的には、linux-source-
Kernelモジュールは、過去記事で作成したCharacter DriverをGitHubから取得(再利用)します。
(注釈) Linux Kernelソースコードの取得
$ uname -r (注釈) Kernelバージョンの確認
4.19.0-5-amd64
$ sudo apt install linux-source-4.19 (注釈) linux-source-X.Xの"X.X"は、unameコマンドで確認したバージョンを記載。
$ tar xf /usr/src/linux-source-4.19.tar.xz
(注釈) Kernelモジュールの取得
$ git clone https://github.com/nao1215/LinuxKernelArticle.git
(注釈) ディレクトリ構成の確認
$ ls
LinuxKernelArticle/ linux-source-4.19/
[the_ad id=“598”]
Kernelモジュール移動およびKconfig修正
自作Kernelモジュールは、以下の構成になっています。自作Kernelモジュール(Charcter Device)は01_char_deviceディレクトリ以下であり、testは自作Kernelモジュールのテスト用プログラムです。
$ tree LinuxKernelArticle/
LinuxKernelArticle/
├── 01_char_device
│ ├── kernel_moduel
│ │ ├── Makefile
│ │ └── debimate_module.c
│ └── test
│ ├── Makefile
│ └── test.c
├── LICENSE
└── README.md
今回必要なdebimate_module.cのみを移動させます。移動先は、linux-source-4.19以下に存在するCharcter Device用ディレクトリ(linux-source-4.19/drivers/char/ )です。
$ cp LinuxKernelArticle/01_char_device/kernel_moduel/debimate_module.c linux-source-4.19/drivers/char/.
移動した自作Kernelモジュール(Charcter Device)をビルド対象に含めるため、linux-source-4.19/drivers/char/Kconfigに以下を追記します。
config DEBIMATE_DRIVER
tristate "DEBIMATE Test Module."
depends on X86
default n
help
This is debimate test module.
追記時の注意点として、Kconfig内の"endmenu"より前に追記しないと、make menuconfig時に自作Kernelモジュール用の設定が表示されません。追記した項目(例:tristate)のそれぞれの意味合いを下表に示します。
| 項目 | 役割 |
|---|---|
| tristate | tristateはビルド時に以下の3種類の選択肢が選べる場合のみ、使用可能です(triが3を意味するため、この名称が使われています)。Kernelは機能をモジュール化できない場合があり、その際はtristateの代わりにboolを使用します。 1. Kernelモジュールが組み込み可能(y) 2. モジュール化が可能(m) 3. ビルドしないか(n) |
| bool | boolは、tristateではない時(機能をモジュール化できない時)に使用します。 |
| depends on | Kernelモジュールが依存しているアーキテクチャや機能を記載します。AND条件は"&&" 、OR条件は"||“で記載します。今回はX86を記載していますが、実際はX86と依存関係がないです(正しくは、TTYに依存しています)。 |
| default | ビルド時のデフォルト(以下のy/m/nのいずれか)を設定します。 1. Kernelモジュールが組み込み可能(y) 2. モジュール化が可能(m) 3. ビルドしないか(n) |
| help | make menuconfigで表示するHELPメッセージ |
Makefileの修正
修正対象のMakefileは、修正したKconfigと同じ階層にあります。今回は、linux-source-4.19/drivers/char/Makefileに対して、以下の1行を追記します。
obj-$(CONFIG_DEBIMATE_DRIVER) += debimate_module.o
追記した行に関して説明します。
obj-$(CONFIG_DEBIMATE_DRIVER)におけるDEBIMETE_DRIVER部分は、Kconfigの"config"以降に記載した文字列と同じです。例えば、Kconfigに"config XYZ_TEST"と記載していた場合、obj-$(CONFIG_XYZ_TEST)と記載します。
debimate_module.o部分は、Kernelモジュールソースコード名と同名でなければいけません(拡張子部分は除く)。例えば、Kernelモジュールがtest_test.cという名称の場合、test_test.oと記載します。
[the_ad id=“598”]
自作Kernelモジュール用コンフィグが表示されるかを確認
linux-source-4.19直下で、make menuconfigを実行します。実行後、Kernel Configuration画面が表示されます。
$ pwd
/home/nao/KERNEL2/linux-source-4.19
$ make menuconfig
今回追加した自作Kernelモジュール用の設定は、Device Drivers -> Character devices -> DEBIMATE Test Module. に存在します。デフォルトでは、ビルド対象に含まれていないため(=n設定のため)、DEBIMATE Test Module.までカーソルを移動した後に、“m"を押下する事によってモジュール化を有効にします。Kernel内部に組み込む場合は、“y"を押下して下さい。

自作モジュールのビルド確認
今回は、Kernel全体をビルドせず、モジュールのみをビルドします。
$ pwd
/home/nao/KERNEL2/linux-source-4.19
$ make -j4 modules (注釈) -jオプションの後の数値は、CPUコア数。
(注釈) ビルド終了後、Kernelモジュールが以下に作成されています。
$ ls drivers/char/debimate_module.ko
drivers/char/debimate_module.ko
[the_ad id=“598”]
最後に:Character Device作成方法に興味がある方へ
本記事で使用したCharacter Deviceに関する記事があります。Character Deviceの作成方法に興味がある方は、ご参考にして下さい。
Linux Kernelの簡単なCharacter Deviceを作成する方法(Linked List APIの使用方法サンプル)
