VitisやPetaLinuxの複雑怪奇現象を探ってみる。
まずは起動時に必要な最終成果物を確認してみた。
ここではSDカードに成果物を入れてZYNQ UltraScale+で実行する場合を想定している。
面倒くさいし、フロー図に描きこんでしまえ!
SDカードは2つのパーティションに分割することが多いだろう。
Boot用のパーティションとLinuxのRoot Filesystemのパーティションである。
Boot用のパーティションはFATでフォーマットされ、LinuxのRoot Filesystemはext4でフォーマットされることが多い。
Boot用パーティションには最低限、次のファイルが格納される。
BOOT.BIN
BOOT.BINはZYNQを起動するためのLinuxを起動するまでのバイナリが格納されている。
Vitis環境であれば概ね、次の4つのファイルが格納されている。
もし、BOOT.BINでPL(Plogramable Logic)を起動するのであれば、BitStreamも含まれる。
image.ub
image.ubはLinuxの次のバイナリが格納されている。
Xilinx社のドキュメントでよく目にするのはこのBOOT.BINとimage.ubではあるが、アプリケーションをVitisでコンパイルした次のバイナリも実行時はどこかに格納しなければいけない。
これらのバイナリはZYNQでLinuxが起動後に読み込めて実行できればいいので、SDカードのどちらのパーティションでも良いし、何らかの通信を使用してZYNQの外部から読み込んで実行しても良い。
VitisとPetaLinuxが複雑怪奇なのは個々に変更したいバイナリが多いのに最終的なバイナリがまとまってしまっている点だと考える。
各ファイルの変更が必要なケースは単純に考えるとつぎのように思い浮かべられる。
ファイル | 変更が発生するケース |
---|---|
pmufw.elf | たぶん、変更するケースはない |
fsbl.elf | PSの設定を変更したら変更する |
bl31.elf | たぶん、変更するケースはない |
u-boot.bin | Linuxをブートするデバイスを追加変更した場合など |
Image | Linux Kernelの変更を行った場合、ドライバを変更した場合など |
zynq.dtb | ドライバを変更した場合、 ドライバを追加削除したい場合など、 ドライバの固定パラメータを変更したい場合など |
app.exe | アプリケーション(OpenCD Host側)を変更した場合など |
app.xclbin | アプリケーション(OpenCD Kernel側)を変更した場合など |
アプリケーション開発だけ見てもLinux Kernelのドライバの追加や修正、アプリもHostとKernelを問わず変更が発生する。
そして、ZYNQの場合、PLの回路を追加や修正をしたり、PSのパラメータを変更したりするケースが意外に多い。
ZYNQの変更を行った場合はPlatformの変更が発生するので次のファイルがケースによって変更が必要になる。
Platformの変更で「変更が発生するケース」の表に示した各ケースが発生すればファイルの変更が必要になる。
例えば、PLの回路を変更したけど、Linuxのドライバやアプリケーションの修正は必要ないという場合、変更が必要なのはBitStreamが格納されているapp.xclbinだけである。
そのためにフローではVivado→PetaLinux→Vitis(Platformのための)→Vitisの経路をたどる必要がある。
ここでPetaLinuxとPlatformのためのVitisの経路は不要なのである。
不要なのにわざわざ通らなくてはならない。
通ったがために別の問題が発生するというのはよく起こること。
だから、VitisとPetaLinuxは難しい。