Linux Kernel Tree内で自作Kernelモジュールをビルドする方法(MakefileとKconfigの書き方)

前書き

過去の記事(環境構築: Linux Kernelモジュールの作成準備)では、

  • Linux Kernelソースコード
  • 自作Kernelモジュール

を分離して管理していました。ディレクトリ構成は、以下のような状態です。

この構成では、自作KernelモジュールおよびLinux Kernelソースコードを同時にビルドできません。そこで、本記事では、自作Kernelモジュールをlinux-source-4.9の中に移動させ、Kernelルートディレクトリ(linux-source-4.9)にあるMakefileから自作Kernelモジュールをビルドする方法を示します。

                     

検証環境

検証環境は、Debian10(buster)で実施します。本記事では、既存のKernelモジュールを利用して、手順を説明します。自作Kernelモジュールを0ベースで作成したい方は、以下の過去記事も合わせて確認して下さい。

環境構築: Linux Kernelモジュールの作成準備

                    

Linux Kernelのビルドに必要なパッケージのinstall

Linux Kernelのビルド時に必要なパッケージをinstallします。以下の手順は、Debian前提です。

                 

Linux KernelソースおよびKernelモジュールの取得

Linux KernelソースコードおよびKernelモジュールを取得します。aptコマンドで取得したLinux Kernelソースコードは、/usr/src以下にtarballで格納されます。具体的には、linux-source-<Version>.tar.xzが一時開発元オリジナルソースコード、その他のファイルがDebian独自のパッチです。詳細は、Debian公式サイトに記載されています。

Kernelモジュールは、過去記事で作成したCharacter DriverをGitHubから取得(再利用)します。

                

Kernelモジュール移動およびKconfig修正

自作Kernelモジュールは、以下の構成になっています。自作Kernelモジュール(Charcter Device)は01_char_deviceディレクトリ以下であり、testは自作Kernelモジュールのテスト用プログラムです。

今回必要なdebimate_module.cのみを移動させます。移動先は、linux-source-4.19以下に存在するCharcter Device用ディレクトリ(linux-source-4.19/drivers/char/ )です。

移動した自作Kernelモジュール(Charcter Device)をビルド対象に含めるため、linux-source-4.19/drivers/char/Kconfigに以下を追記します。

追記時の注意点として、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)におけるDEBIMETE_DRIVER部分は、Kconfigの”config”以降に記載した文字列と同じです。例えば、Kconfigに”config XYZ_TEST”と記載していた場合、obj-$(CONFIG_XYZ_TEST)と記載します。

debimate_module.o部分は、Kernelモジュールソースコード名と同名でなければいけません(拡張子部分は除く)。例えば、Kernelモジュールがtest_test.cという名称の場合、test_test.oと記載します。

                  

自作Kernelモジュール用コンフィグが表示されるかを確認

linux-source-4.19直下で、make menuconfigを実行します。実行後、Kernel Configuration画面が表示されます。

今回追加した自作Kernelモジュール用の設定は、Device Drivers -> Character devices -> DEBIMATE Test Module. に存在します。デフォルトでは、ビルド対象に含まれていないため(=n設定のため)、DEBIMATE Test Module.までカーソルを移動した後に、”m”を押下する事によってモジュール化を有効にします。Kernel内部に組み込む場合は、”y”を押下して下さい。

Kernel Config

                                 

自作モジュールのビルド確認

今回は、Kernel全体をビルドせず、モジュールのみをビルドします。

                                     

最後に:Character Device作成方法に興味がある方へ

本記事で使用したCharacter Deviceに関する記事があります。Character Deviceの作成方法に興味がある方は、ご参考にして下さい。

Linux Kernelの簡単なCharacter Deviceを作成する方法(Linked List APIの使用方法サンプル)

                                               

おすすめ