1.はじめに
前回、RISC-V技術ブログ連載第8回「SiFive最新リリース HiFive Unmatchedボードのご紹介④ 」では組込み機器用のLinuxディストリビューションを作るためのフレームワークを採用したFreedom U SDK(FUSDK)のご紹介と、FUSDKで作成したLinuxのブート方法について解説しました。
今回は、そのFUSDKで作成したLinuxのブートフローについて、少し掘り下げて見ていきます。統合開発環境Freedom Studioのデバッグ機能を利用して、HiFive Unmatchedボードの実際の動きを確認する様子も併せてお伝えします。
2.FUSDKが採用しているブートフロー
SiFiveがGitHub(https://github.com/sifive/freedom-u-sdk)で公開しているFUSDKでは、リリースバージョンの違いによって、下図に示すようにブートフローに違いがあります。
HiFive Unmatchedボードは、FUSDK Release 2021.02以降からサポートされるため、上記の③が対象になります。次の章では、③FUSDK Release 2021.03のブートフローに焦点を当てて見ていきます。
3.FUSDK Release 2021.03のブートフロー
FUSDKはリリースバージョンの違いよって、ブートフローにも違いがあることを前章で示しましたが、今回はHiFive Unmatchedボードに同梱のmicroSDカードに入っているFUSDK Release 2021.03をベースに詳細を見ていきます。
それぞれの動作モード、格納されているメモリ、ダウンロード後に実行されるメモリがわかるように示した図を以下に示します。
次にそれぞれのステップについて見ていきます。
①Reset Vector
Reset Vectorはリセット直後に実行されます。コードは0x1000のマスクROMに格納されており、ユーザーが変更することはできません。HiFive Unmatchedボードはマルチコア構成のFU740が搭載されていますが、すべてのコアが0x1004に分岐します。そして、下図に示すように、DIPスイッチによって変化するMSELの状態によって確定するアドレスへ分岐します。
②Zeroth Stage Boot Loader(ZSBL)
Zeroth Stage Boot Loader(ZSBL)は、Reset Vectorから最初に分岐して実行されるブートローダーです。コードは0x1_0000のマスクROMに格納されており、ユーザーが変更することはできません。
③U-Boot Secondary Program Loader (U-Boot SPL)
U-Boot SPLはZSBLの次に実行されます。
④OpenSBI
OpenSBIはスーパーバイザー実行環境(SEE)とスーパーバイザーの間のI/Fの提供と、チップ自体では実装されていないRISC-Vに必要な命令をエミュレートする役割を果たします(※1)(※2)。
⑤U-Boot
U-BootはLinuxカーネルのロードに使用されるハードウェアの管理とLinuxカーネルのダウンロード、実行を行う高機能なブートローダーで、多くのプラットフォーム、プロセッサ・アーキテクチャーに対応しています。
※1 RV32IMAまたはRV64IMAは必須ですが、D拡張(倍精度浮動小数点)、F拡張(単精度浮動小数点)、H拡張(ハイパーバイザー)が実装されていない場合、実行時にエミュレートされます。
※2 参考URL:
https://github.com/riscv/riscv-sbi-doc
https://gitee.com/Virtulization/opensbi/blob/master/docs/platform_requirements.md
4.HiFive Unmatchedボードの実際の動きを確認する
本章では、前章で説明したブートフローについて、デバッガを用いることで実際の動作を確認します。
HiFive Unmatchedボードには、JTAGを使ったデバッグを可能とするためのUSBシリアル変換チップが搭載されています。そのため、JTAG-ICEを別途用意することなくPCとUSB接続するだけで、JTAGデバッグを行うことができます。SiFiveが提供しているソフトウェア統合開発環境Freedom Studioにはそのための仕組みが用意されており、手軽にJTAGデバッグを行うことができます(※3)。
※3 本ブログ執筆時点では、SiFiveはHiFive UnmatchedボードのJTAGデバッグについて、公式にアナウンスしていません。あくまで非公式での動作確認になる点、ご注意ください。
4.1.動作環境
①ハードウェア
・PC
メモリ:8GB以上推奨
・HiFive Unmatched
ボード本体
同梱microSDカード(FUSDK Linux起動イメージ書き込み済み)
・ATX電源
HiFive Unmatchedボード起動用
・USBケーブル(TypeA⇔MicroB)
データ通信用
②ソフトウェア
・OS
Windows 10 64bit
・ターミナルソフト
TeraTerm(ver.4.106)
・ソフトウェア統合開発環境(IDE)
Freedom Studio (2021-04-1-win64)
・HiFive Unmatchedボード デバッグ用ソフトウェアモジュール
Freedom E SDK付属BSP (※4)
※4 GitHubで公開されているFreedom E SDKのmasterブランチ(本ブログ執筆時点8/27)のものを利用します。
4.2.事前準備
HiFive UnmatchedボードをJTAGデバッグする際、リセット直後にプログラムが走り出してしまわないように、DIPスイッチを下図のように設定する必要があります。
また、現時点ではFreedom StudioでHiFive Unmatched用のFreedom E SDKプロジェクトを作成することができません。そのため、他のターゲット用のFreedom E SDKプロジェクトを作成し、そのプロジェクトを利用してデバッグ用の設定を行います。
①デバッグコンフィグレーション設定例 [Target]タブ
②デバッグコンフィグレーション設定例 [Debugger]タブ
4.3.デバッガによる動作確認
それでは、デバッガを使って実際の動きを見ていきます。
①Reset Vector
デバッグ開始後、ブレークすると下図に示すように、期待どおりにReset Vectorに来ていることが確認できました。
すべてのスレッド(Hart)はReset Vectorにあり、0x1000番地の値から、MSEL=0000が反映されていることがわかります。コードを見ていくと、0x1100番地にあるテーブルを参照して、分岐先が決定されることがわかります。MSEL=0000の場合は、0x1004へ分岐しループとなることがわかります。
②Zeroth Stage Boot Loader(ZSBL)
MSEL=0000のままだとReset Vectorから抜け出せないため、MSEL=1011となるようにDIPスイッチを変更し、Instruction Stepを実行します。すると、0x1_0000のZSBLの領域へ分岐することがわかりました。
③U-Boot Secondary Program Loader (U-Boot SPL)
0x800_0000のL2 LIM領域へハードウェアブレークポイントを設定後、実行(Resume)します。すると、0x800_0000で期待どおりにブレークしました。
④OpenSBI
0x8000_0000のDDRメモリ領域へハードウェアブレークポイントを設定後、実行(Resume)します。すると、0x8000_0000で期待どおりにブレークしました。U-Boot SPLが実行されるため、ターミナルソフトには下図のようなメッセージが表示されました。
⑤U-Boot
すべてのブレークポイントを解除し、実行(Resume)します。すると、U-Bootが実行されてターミナルソフトには下図のようなU-Bootの起動を示すメッセージが表示されました。
5.まとめ
いかがでしたでしょうか。今回は、FUSDKで作成したLinuxのブートフローについて、少し掘り下げて見てきました。また、HiFive Unmatchedボードの実際のブート動作を、デバッガを活用することで確認することができました。
次回は、HiFive Unmatchedボード上で簡単にTensorFlow Liteの動作が確認できる点や、HiFive Unmatchedで動作するLinuxアプリケーションをいくつかご紹介できればと思います。
なお、本ブログについてのより詳しい内容へのご質問、またご紹介した各種評価ボードを実際に触ってみたいという方は評価ボード貸し出しの対応も行っておりますので、ぜひお気軽にお問合せください。
お問い合わせはこちら
info-lsi@dts-insight.co.jp
■■DTSインサイトの「システムLSI設計ソリューションサービス」■■
DTSインサイトでは、システムLSI/FPGA設計の受託も行っています。
当社のノウハウを活かした、ソフトウェアの移行(マイグレーション)
サービスも提供しておりますので、お気軽にご相談ください。
システムLSI設計ソリューションサービス紹介は こちら