1.記事一覧
記事は複数回に分けて投稿します。Zynq7020SoCで動作する、PetaLinuxを使わない素のLinuxを構築します。
エッジArm Linux構築編(armv7l)
- 【Zynq7】Petaを使わず素のLinuxをソースから構築する
- 【Zynq7】1.FSBLの構築
- 【Zynq7】2.U-bootの構築
- 【Zynq7】3.Linuxカーネルの構築
- 【Zynq7】4.Zyboz7ボードのデバイスツリー構築
- 【Zynq7】5.RootFSのマウント(Ubuntu18.04)
- 【zynq7】6.カーネルモジュールの配置 ←本ページ
- 【Zynq7】番外編1.u-bootが途中で止まる問題
- 【Zynq7】番外編2.MACアドレスをQSPIFlashから読み出して設定する
エッジArm Linux実践編(armv7l)
- 【Zynq7】実践1. LinuxにRTCを認識させる【I2Cデバイス】
- 【Zynq7】実践2. 温度センサをPython+Dockerで使う【I2Cデバイス】
- 【Zynq7】実践3. 組込みLinuxでコンテナ導入に苦労した話【Docker Engine編】
- 【Zynq7】実践4. LinuxでSPIを使う【液晶編1】
- 【Zynq7】実践5. ZynqPLのGPIOをLinuxで使う【液晶編2】
- 【Zynq7】実践6. PythonでSPI液晶を使う【液晶編3】
- 【Zynq7】閑話. SPI バス周波数が上がらない問題
2.概要
この記事ではlinuxのカーネルモジュールのクロスビルドを行い、前回Arm Linux用に構築したRootFsの/lib/modules/以下に配置するカーネルモジュール群を生成します。
今回対象となるカーネルモジュールとはmenuconfigで’M’のチェックをつけている機能になります。’*’チェックはLinuxカーネルイメージ本体に結合されますが、’M’は結合されず、その機能を使用するときにシステムがRootFsの/lib/modules以下からカーネルモジュールファイル(.ko)をinsmodで取り込みます。共有ライブラリやダイナミックリンクライブラリのようなものですね。Linuxカーネルイメージサイズが肥大化しないのがメリットです。
また、USB WifiドライバなどのLinux本家のカーネル(MainLine)がリリースしているものではなく、一般の有志やチップベンダ独自でリリースしているカーネルモジュールソースコードをビルドする場合はまた別の機会にやります。
3.環境
ホストPC | Ubuntu20.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)
$ export CROSS_COMPILE=arm-linux-gnueabihf-
4-2. ビルド実行
linux-xlnxフォルダ直下に移動し、カーネルモジュール格納フォルダを作成します。
$ cd ./linux-xlnx
$ mkdir ./modroot
ビルドを実行します。
時間がかかるので、並列Jobオプション(-j*)をつけて高速化します。ホストPCのMAX論理コア数+1個の並列数までにします。私の環境だとMAX -j5になります。
$ make -j5 ARCH=arm INSTALL_MOD_PATH=./modroot modules
カーネルモジュールを出力します。
$ make ARCH=arm INSTALL_MOD_PATH=./modroot modules_install
出力ファイルを確認します。
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で固めて転送
$ cd linux-xlnx/modroot
$ tar -zcvf module.tar.gz lib/
5-2. SCPでボード上のRootFsに転送
予めSSHでzyboz7ボードにアクセスできるようにしておいてください。
tarを転送します。
#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にあります。
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にカーネルモジュールフォルダを作成します。すでにあれば不要です。
zynq@zyboz7:~$ sudo mkdir -p /lib/modules
/lib/modulesにコピーします。
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でビルドしたときのシンボリックリンクが残っていますがとりあえず大丈夫です。