« ZynqberryのQSPI ROMにXILINX SDK 2018.2以降で書き込むには | トップページ | ELECOMのWDC-150SU2MをZYNQのLinuxから使う »

2019.09.29

ZYNQ Linuxの/lib/modulesフォルダやmodules.dep等の作り方

これまでZynqberry用のUbuntu Linuxを提供してまいりましたが、恥ずかしながら今まで/lib/modules/($uname -r)/フォルダの作り方がわからなかったので、このフォルダを提供できず、modprobeなどができませんでした。

mkdirで空の/lib/modules/$(uname -r)を作っておけば様々なエラーの回避はできるのですが、正しいmodules.dep等がないとカーネルモジュールが使えません。

 

今、ようやく/lib/modules/$(uname -r)/フォルダの作り方を理解したので紹介します。

まず、前提として/lib/modules/$(uname -r)/というフォルダは、Linuxのカーネルコンパイルの際に一緒に作られます。したがって、Linuxをコンパイルしたときのソースフォルダがが必要です。

しかし、今更そのようなフォルダはないとか、コンフィグを変えて再コンパイルしてしまったなどで、当時のフォルダがないことも多々あるでしょう。

そのような場合でも心配はいりません。過去のLinuxのソースはいつでもダウンロードできるし、コンパイルの際のコンフィグは動作中のLinuxから得ることができるからです。

Zynqberryの場合、XILINX用Linuxカーネル4.9.0なので、Xilinxのgitからダウンロードしてきます。

以下、クロスビルド用のホストPCでの作業です。

$ git clone -b xlnx_rebase_v4.9 git://github.com/Xilinx/linux-xlnx.git
$ cd linux-xlnx

Linuxのコンパイルに使用したコンフィグは、オプションで無効にしていなければ/proc/config.gzにあります。動作中のZynqberryの/procからconfig.gzをコピーしてきて、解凍して.configを作ります。

$ scp ユーザ名@IPアドレス:/proc/config.gz .
$ gunzip -c < config.gz > .config

これで、コンパイル当時のLinuxのソースフォルダが再構成できました。

そうしたらCROSS_COMPILEのマクロを設定したり、Xilinx SDKの初期化コマンドを実行して環境を整えたら、Linuxカーネルをコンパイルします。

$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ source /opt/Xilinx/SDK/2017.4/settings64.sh ← 環境に応じて変えよ
$ make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage

当時の状況でLinuxカーネルがコンパイルされ、arch/arm/bootにuImageが出来上がっているはずです。

そうしたら、次に以下のコマンドを入力します。

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

これで、linux-xlnx/modroot配下にlibフォルダが作られ、その中にモジュール一式が入っているというわけです。

見てみましょう

naitou@ubuntu:~/linux-xlnx/modroot/lib/modules/4.9.0-xilinx$ ls -al
合計 92
drwxrwxr-x 3 naitou naitou 4096 9月 29 11:34 .
drwxrwxr-x 3 naitou naitou 4096 9月 29 11:34 ..
lrwxrwxrwx 1 naitou naitou 23 9月 29 11:34 build -> /home/naitou/linux-xlnx
drwxrwxr-x 5 naitou naitou 4096 9月 29 11:34 kernel
-rw-r--r-- 1 naitou naitou 353 9月 29 11:34 modules.alias
-rw-r--r-- 1 naitou naitou 455 9月 29 11:34 modules.alias.bin
-rw-rw-r-- 1 naitou naitou 16780 9月 29 11:34 modules.builtin
-rw-r--r-- 1 naitou naitou 19538 9月 29 11:34 modules.builtin.bin
-rw-r--r-- 1 naitou naitou 832 9月 29 11:34 modules.dep
-rw-r--r-- 1 naitou naitou 1647 9月 29 11:34 modules.dep.bin
-rw-r--r-- 1 naitou naitou 52 9月 29 11:34 modules.devname
-rw-rw-r-- 1 naitou naitou 426 9月 29 11:34 modules.order
-rw-r--r-- 1 naitou naitou 131 9月 29 11:34 modules.softdep
-rw-r--r-- 1 naitou naitou 3613 9月 29 11:34 modules.symbols
-rw-r--r-- 1 naitou naitou 4529 9月 29 11:34 modules.symbols.bin
lrwxrwxrwx 1 naitou naitou 23 9月 29 11:34 source -> /home/naitou/linux-xlnx

そうしたらこれをtgzで固めて、Zynqberryに転送します。

$ tar -zcvf module.tgz lib/
$ scp module.tgz ユーザ名@IPアドレス:/home/share

受け取ったZynqberryではこれを解凍し、($uname -r)以下に移動します。

# tar -zxvf module.tgz
# mv lib/modules/4.9.0-xilinx/ /lib/modules/4.9.0-xilinx-00027-g9c2e29b/

lsで様子を見てみます。

Zb_modules

これでカーネルモジュールに対応でき、lsmodやinsmod、modprobeなどが使えるようになりました。

作成したmodulesと、カーネルヘッダは下記のURLからダウンロードできます。

http://trenz.jp/download.html

なお、上の図のとおりbuildフォルダとsourceフォルダがクロスコンパイルに使ったホストPCのフォルダ名のシンボリックリンクを参照してしまっているのと、カーネルコンパイルが終わった状態でlinux-xlnxフォルダは3.3GByteもあるので、容易には配布できません。そのため、ソース一式の配布はいたしません。必要な場合は上記の手順で作りなおした方が早いと思います。

|

« ZynqberryのQSPI ROMにXILINX SDK 2018.2以降で書き込むには | トップページ | ELECOMのWDC-150SU2MをZYNQのLinuxから使う »

コメント

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

で生成した modroot 以下の lib ディレクトリですが、シンボリックリンクを含むので、上の手順で tar で固めると、ターゲットのボードで展開した後にシンボリックリンクが解決できず、カーネルモジュールのビルドなどをしようとするとうまくいかなくなると思います。

この問題を解決するには、tar のオプションで h オプションを追加すると、シンボリックリンクをたどって固めてくれるようです。

ご参考までに。

投稿: ねっぽ | 2021.06.07 05:52

追加です。

tar で h オプションをつけるときは、上記の INSTALL_MOD_PATH をカーネルツリー以外のどこかに指定しないといけないようです。
カーネルツリーの中に入れてしまうと、循環参照的な感じで永遠に tar が終わらないという。。。

罠でした。

投稿: ねっぽ | 2021.06.07 05:59

有用な情報ありがとうございます!

投稿: なひたふ | 2021.06.09 17:00

コメントを書く



(ウェブ上には掲載しません)




« ZynqberryのQSPI ROMにXILINX SDK 2018.2以降で書き込むには | トップページ | ELECOMのWDC-150SU2MをZYNQのLinuxから使う »