Linux

【Zynq7】6.カーネルモジュールの配置

1.記事一覧

記事は複数回に分けて投稿します。Zynq7020SoCで動作する、PetaLinuxを使わない素のLinuxを構築します。

ZynqMP(arm64版)はこちら

エッジArm Linux構築編(armv7l)

エッジArm Linux実践編(armv7l)

2.概要

この記事ではlinuxのカーネルモジュールのクロスビルドを行い、前回Arm Linux用に構築したRootFsの/lib/modules/以下に配置するカーネルモジュール群を生成します。

今回対象となるカーネルモジュールとはmenuconfigで’M’のチェックをつけている機能になります。’*’チェックはLinuxカーネルイメージ本体に結合されますが、’M’は結合されず、その機能を使用するときにシステムがRootFsの/lib/modules以下からカーネルモジュールファイル(.ko)をinsmodで取り込みます。共有ライブラリやダイナミックリンクライブラリのようなものですね。Linuxカーネルイメージサイズが肥大化しないのがメリットです。

また、USB WifiドライバなどのLinux本家のカーネル(MainLine)がリリースしているものではなく、一般の有志やチップベンダ独自でリリースしているカーネルモジュールソースコードをビルドする場合はまた別の機会にやります。

3.環境

ホストPCUbuntu20.04, intel core i5 750 RAM 16G
Docker(ビルド環境)Docker Engine v23.0.0, Ubuntu20.04 base image
ターゲットボードDigilent Zybo z7-20 Rev.B.2(XC7Z020-1CLG400C, DDR3 1GB)
LinuxカーネルXilinxがGitHubで提供するソースコード tag=xilinx-v2022.2
Linux kernel v5.15
https://github.com/Xilinx/linux-xlnx/tree/xilinx-v2022.2

Linuxカーネルのビルド環境で使用したDockerコンテナ環境を使用します。理由は私のホストPCではすでに別の開発環境が入っており、クリーンでないからです。再現性を高めるためなので、必ずしも使う必要はなく、直接ホストPC上に環境構築しても問題ありません。

4.カーネルモジュールのビルド

Linuxカーネルビルドで使用したDockerに入ります。

4-1. Linuxクロスビルド環境変数(armv7l)

Bash
$ export CROSS_COMPILE=arm-linux-gnueabihf-

4-2. ビルド実行

linux-xlnxフォルダ直下に移動し、カーネルモジュール格納フォルダを作成します。

Bash
$ cd ./linux-xlnx
$ mkdir ./modroot

ビルドを実行します。
時間がかかるので、並列Jobオプション(-j*)をつけて高速化します。ホストPCのMAX論理コア数+1個の並列数までにします。私の環境だとMAX -j5になります。

Bash
$ make -j5 ARCH=arm INSTALL_MOD_PATH=./modroot modules

カーネルモジュールを出力します。

Bash
$ make ARCH=arm INSTALL_MOD_PATH=./modroot modules_install

出力ファイルを確認します。

Bash
user@38a38b214b7c:/home/share/linux_wk/linux-xlnx$ ls -al ./modroot/lib/modules/5.15.0-zyboz7_custom/

total 96
drwxr-xr-x 3 user user 4096 Mar 5 20:17 .
drwxr-xr-x 3 user user 4096 Mar 5 20:17 ..
lrwxrwxrwx 1 user user 42 Mar 5 20:17 build -> /home/share/zynq7linux/linux_wk/linux-xlnx
drwxr-xr-x 4 user user 4096 Mar 5 20:17 kernel
-rw-r--r-- 1 user user 9342 Mar 5 20:17 modules.builtin
-rw-r--r-- 1 user user 63309 Mar 5 20:17 modules.builtin.modinfo
-rw-r--r-- 1 user user 7443 Mar 5 20:17 modules.order
lrwxrwxrwx 1 user user 42 Mar 5 20:17 source -> /home/share/zynq7linux/linux_wk/linux-xlnx
user@38a38b214b7c:/home/share/linux_wk/linux-xlnx$

modroot/lib/modules/5.15.0-zyboz7_custom/kernel以下にカーネルモジュール(.ko)が入っています。

5.カーネルモジュールをRootFsへ配置する

前回でRootFsの構築が完了し、Linuxを起動できる用になりました。この時、SSHサーバをインストールしていたので、SSHアクセスできる用になっています。SSH経由でファイルを転送するSCPコマンドを使用して、RootFsに配置したいと思います。

5-1. カーネルモジュールをtarで固めて転送

Bash
$ cd linux-xlnx/modroot
$ tar -zcvf module.tar.gz lib/

5-2. SCPでボード上のRootFsに転送

予めSSHでzyboz7ボードにアクセスできるようにしておいてください。
tarを転送します。

Bash
#scp module.tar.gz (zynqのユーザ名)@IPアドレス:RootFsの転送先PATH
$ scp modules.tar.gz zynq@192.168.2.4:/home/zynq

5-3. ボード側でカーネルモジュールを配置する

SSHでログインします。転送ファイルは/home/zynq/module.tar.gzにあります。

Bash
zynq@zyboz7:~$ tar -zxvf module.tar.gz
zynq@zyboz7:~$ ls -al ./lib/modules/5.15.0-zyboz7_custom/
total 96
drwxr-xr-x 3 zynq zynq 4096 Mar 6 05:17 .
drwxr-xr-x 3 zynq zynq 4096 Mar 6 05:17 ..
lrwxrwxrwx 1 zynq zynq 42 Mar 6 05:17 build -> /home/share/zynq7linux/linux_wk/linux-xlnx
drwxr-xr-x 4 zynq zynq 4096 Mar 6 05:17 kernel
-rw-r--r-- 1 zynq zynq 9342 Mar 6 05:17 modules.builtin
-rw-r--r-- 1 zynq zynq 63309 Mar 6 05:17 modules.builtin.modinfo
-rw-r--r-- 1 zynq zynq 7443 Mar 6 05:17 modules.order
lrwxrwxrwx 1 zynq zynq 42 Mar 6 05:17 source -> /home/share/zynq7linux/linux_wk/linux-xlnx
zynq@zyboz7:~$

/libにカーネルモジュールフォルダを作成します。すでにあれば不要です。

Bash
zynq@zyboz7:~$ sudo mkdir -p /lib/modules

/lib/modulesにコピーします。

Bash
zynq@zyboz7:~$ sudo cp -r ./lib/modules/* /lib/modules/
zynq@zyboz7:~$ ls -al /lib/modules/5.15.0-zyboz7_custom/
total 96
drwxr-xr-x 3 root root 4096 Mar 6 19:56 .
drwxr-xr-x 3 root root 4096 Mar 6 19:56 ..
lrwxrwxrwx 1 root root 42 Mar 6 19:56 build -> /home/share/linux_wk/linux-xlnx
drwxr-xr-x 4 root root 4096 Mar 6 19:56 kernel
-rw-r--r-- 1 root root 9342 Mar 6 19:56 modules.builtin
-rw-r--r-- 1 root root 63309 Mar 6 19:56 modules.builtin.modinfo
-rw-r--r-- 1 root root 7443 Mar 6 19:56 modules.order
lrwxrwxrwx 1 root root 42 Mar 6 19:56 source -> /home/share/linux_wk/linux-xlnx
zynq@zyboz7:~$

ホストPCでビルドしたときのシンボリックリンクが残っていますがとりあえず大丈夫です。

ABOUT ME
sh-goto
組込エンジニア. 最近の遊びはLinuxの低レイヤいじりとXilinxのZynqとFPGAを使った電子工作