Linux

【Zynq7】Yoctoを使わずに素のLinuxをソースから構築する

1.記事一覧

本記事は複数回に分けて投稿します。Xilinx社のARMコアとFPGAを搭載するSoCのZynq7020で動作するLinuxを構築します。Xilinxが提供するYoctoベースのPetaLinuxを使わず、普通のLinuxをソースコードからビルドして構築します。今回ディストリビューションにはUbuntuを選びます。

ZynqMP(arm64版)はこちら

エッジArm Linux構築編(armv7l)

エッジArm Linux実践編(armv7l)

2.なぜこの記事を書くのか

ポイント

  • 組込みLinuxの基礎の勉強が主な目的です
  • 神本「ZYNQで実用的なシステムを構築するための本」の内容に感動…
  • 上の書籍より新しい環境で構築をやってみたときのあれやこれを書きます
  • Xilinx提供のPetaLinuxやYoctoの話は出てきません。普通のLinuxです

ここ数ヶ月で私が勉強したArm向けの組込みLinuxの構築方法をアウトプットの練習として書いていきます。対象のハードはXilinx社のZynq7020SoCを搭載したDigilent製のZyboz7ボードになります。

Xilinx社のような半導体チップベンダが提供するYoctoベースLinuxとは、開発を効率化する目的やフルカスタム可能な豊富な機能を提供するため、YoctoProjectのような巨人の肩に乗ったLinuxディストリビューションです。実際仕事でもYoctoが使われるシーンがあります。しかし、Yoctoは規模が大きく複雑な分、組込みLinuxの基礎を入門するにはハードルが高く扱いづらさがあります。

そのような中、最小構成のLinuxをゼロから構築できるようなナレッジがないか探していたところ、「ZYNQで実用的なシステムを構築するための本(PDF版)」に出会い、速攻で勉強のために評価ボードを購入し、Linuxの構築にチャレンジしました。

この書籍は技術書典13(2022秋開催)にて販売されていた、特殊電子回路(株)代表のなひたふ氏の著書になります。この本ではXilinx社が提供するYoctoベースのLinuxディストリビューションである「PetaLinux」を使用しない、オリジナルZynqカスタムボードを扱う企業向けにオリジナルのLinuxのシステムを構築するための方法が記載されています。FPGA界隈では有名ななひたふ氏のブログ「なひたふJTAG日記」のノウハウが詳しくまとめられています。大変貴重な本だと思います(しかも1,500円!安すぎませんか…)。

低レイヤあるあるとしてこのような情報は賞味期限が短いという点があります。つまりツールやソースコードの更新などによって少し時間が経つと同じ方法による再現性が無くなります。一見さんお断り感が低レイヤは特に強めです。Linuxの構築にチャレンジするにあたり、貴重な情報の賞味期限を伸ばすべく、書籍とは異なる新しい環境で構築を進めていきたいと思います。本の通りに進めたい方は注意です。特に書籍で扱うXilinx社のXilinx SDKツールは2018~2020年にVitisに世代交代し、扱い方がかなり変わってしまっています。

最後に、このようなソースビルドからLinux起動まで一貫して体験できるまとまった情報が世に出てくることは基本的に珍しいです。これから私のような低レイヤの世界に入ってみたい同志は賞味期限が切れないうちに体験し、その後はu-boot,Linuxソースコードやツール更新時に差分を確認する手順を踏むと挫折しにくいと思います。ただ学生の方にはzynqボードは高価過ぎるため、お財布とよく相談してください(zyboz7ボードだと秋月で¥57,000、円安で値上がりしました)。当然ですが、自己責任でお願いします。

3.Linuxが起動するまでの流れ

ポイント

  • 組込みLinux起動までのブートローダは3段階(内蔵、1st、2nd)
  • u-boot以降の知識は他社のArmSoCでも応用が効く
  • デバイスツリーはArmターゲット向けの仕組み。x86系は使わない

システムの電源が入るとパワーオンリセットで左上の内蔵ブートローダが起動します。内蔵ブートローダは基本書き換え不可で、SPIROMやSDカードからboot.binファイルを読み出します。

boot.binはVivadoで作成するbitstream(zynqのPL部つまりFPGAの構築情報)とVitisで作成するFSBL(First Stage Boot Loader)とu-bootの3つを結合したファイルです。u-bootとは組込みLinuxでよく利用されているオープンソースのブートローダで、SBL(Second Boot Loader)として使用します。Linuxカーネルを実行するまでに内蔵、1st、2ndの3段階のブートローダが順に実行されます。

FSBLではzynqSoCのハードウェアの初期化を行います。この時周辺機能やSDRAMも初期化されます。そしてu-bootをSDRAMに配置して呼び出します。

ここまではXilinxのZynqSoCデバイスに依存した内容になります。RenesasのRZ、NXPのi.MX、TIのAM、ラズパイで有名なBroadcomのBCMなど他社チップだと全くやり方が異なりますが、u-boot以降は共通して使われます。

u-bootはLinuxカーネルとデバイスツリーをSDRAMに配置し、Linuxカーネルを呼び出します。

Linuxカーネルが起動している間、デバイスツリーを読み出して、ボードの構成に合ったデバイスドライバをprobeして使用できるようにします。最後にRootFS(ルートファイルシステム)をマウントして起動完了します。

デバイスツリーとはLinux ARM環境で導入された仕組み(おそらくkernel3.xあたりから)です。組込み向けに使用されるARMボードの種類がとても膨大になり、以前では差異をLinuxカーネルで吸収していたため、一時期Linuxカーネルサイズが急増しました。これによりボードの(搭載デバイスの)差異をデバイスツリーという仕組みでLinuxカーネルと分けることになったという経緯があります。

注意点としてu-bootにもデバイスツリーがあります。役割としては同じですが、Linuxデバイスツリーとは別物です。混同しないようにします。

4.使用する環境について

今回使用する環境については以下のようにします。

開発PCUbuntu20.04, intel core i5 750 RAM 16G
XilinxツールVivado,Vitis 2022.2(注:参考書より新しい環境で実施 現在最新2023/1)
ターゲットボードDigilent Zybo z7-20 Rev B.2(XC7Z020-1CLG400C, DDR3 1GB)
arch:Cortex-A9 DualCore 666MHz(armv7hf)
・microSDカード32G(起動ディスクとして使用するため)
・USBケーブルmicroB(UARTコンソールを使用するため)
ビルド環境(任意)Docker v23.0.0, Ubuntu20.04 Base Image(使わなくても良いです)
u-bootXilinxがGitHubで提供するソースコード tag=xilinx-v2022.2
u-boot 2022.01
https://github.com/Xilinx/u-boot-xlnx/tree/xilinx-v2022.2
LinuxカーネルXilinxがGitHubで提供するソースコード tag=xilinx-v2022.2
Linux kernel v5.15
https://github.com/Xilinx/linux-xlnx/tree/xilinx-v2022.2
デバイスツリーXilinxがGitHubで提供するものをベースに使用 tag=xilinx_v2022.2
https://github.com/Xilinx/device-tree-xlnx/tree/xilinx_v2022.2
RootFSUbuntu18.04(armv7l)

VivadoとVitisのインストールは説明しません。他を参考にしてください。インストールに大きなストレージ容量(フルインストールだと161GB)と時間(自環境だと7時間ほど)がかかりますので注意してください。WindowsとUbuntuに対応していたはずです。私は小林優氏の著書「FPGAプログラミング大全 Xilinx編 第2版」を参考にしました。

今回使用するターゲットボードはDigilent社の評価ボード”Zybo z7-20″を使用します。

ABOUT ME
sh-goto
低レイヤで遊んでいます