Linux Kernel Tree内で自作Kernelモジュールをビルドする方法(MakefileとKconfigの書き方)
前書き
過去の記事(環境構築: Linux Kernelモジュールの作成準備)では、
- Linux Kernelソースコード
- 自作Kernelモジュール
を分離して管理していました。ディレクトリ構成は、以下のような状態です。
1 2 3 |
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ベースで作成したい方は、以下の過去記事も合わせて確認して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ 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モジュールの作成準備
Linux Kernelのビルドに必要なパッケージのinstall
Linux Kernelのビルド時に必要なパッケージをinstallします。以下の手順は、Debian前提です。
1 2 3 4 5 |
$ 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-<Version>.tar.xzが一時開発元オリジナルソースコード、その他のファイルがDebian独自のパッチです。詳細は、Debian公式サイトに記載されています。
Kernelモジュールは、過去記事で作成したCharacter DriverをGitHubから取得(再利用)します。
1 2 3 4 5 6 7 8 9 10 11 12 |
(注釈) 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/ |
Kernelモジュール移動およびKconfig修正
自作Kernelモジュールは、以下の構成になっています。自作Kernelモジュール(Charcter Device)は01_char_deviceディレクトリ以下であり、testは自作Kernelモジュールのテスト用プログラムです。
1 2 3 4 5 6 7 8 9 10 11 |
$ 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/ )です。
1 |
$ 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に以下を追記します。
1 2 3 4 5 6 |
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を使用します。
|
bool | boolは、tristateではない時(機能をモジュール化できない時)に使用します。 |
depends on | Kernelモジュールが依存しているアーキテクチャや機能を記載します。AND条件は”&&” 、OR条件は”||”で記載します。今回はX86を記載していますが、実際はX86と依存関係がないです(正しくは、TTYに依存しています)。 |
default | ビルド時のデフォルト(以下のy/m/nのいずれか)を設定します。
|
help | make menuconfigで表示するHELPメッセージ |
Makefileの修正
修正対象のMakefileは、修正したKconfigと同じ階層にあります。今回は、linux-source-4.19/drivers/char/Makefileに対して、以下の1行を追記します。
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と記載します。
自作Kernelモジュール用コンフィグが表示されるかを確認
linux-source-4.19直下で、make menuconfigを実行します。実行後、Kernel Configuration画面が表示されます。
1 2 3 4 |
$ 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全体をビルドせず、モジュールのみをビルドします。
1 2 3 4 5 6 7 8 |
$ 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 |
最後に:Character Device作成方法に興味がある方へ
本記事で使用したCharacter Deviceに関する記事があります。Character Deviceの作成方法に興味がある方は、ご参考にして下さい。
Linux Kernelの簡単なCharacter Deviceを作成する方法(Linked List APIの使用方法サンプル)
ロシア人と国際結婚した地方エンジニア。
小学〜大学院、就職の全てが新潟。
大学の専攻は福祉工学だったのに、エンジニアとして就職。新卒入社した会社ではOS開発や半導体露光装置ソフトを開発。現在はサーバーサイドエンジニアとして修行中。HR/HM(メタル)とロシア妻が好き。サイトに関するお問い合わせやTwitterフォローは、お気軽にどうぞ。