はじめに
前回までは、wolfBootをNUCLEO-F401REで動作させるための準備を進めてきました。
今回は、wolfBootのメモリ配置について調べてみました。
メモリマップ
メモリマップは、wolfSSL社が公開しているGitHubの以下のドキュメントに詳細が書かれています。
ファームウェアイメージ
ファームウェアイメージヘッダー
ファームウェアイメージ
ドキュメントから今まで行ってきた準備の結果をメモリマップに割り当ててみると、下図のようになると思われます。
wolfBootはSecotr0からSector2までの全てを使用していません。
0x0800_0000 から必要なサイズ使用しています。
factory.bin
STM32CubeProgrammerでNUCLEO-F401REに書き込んだ/wolfBoot/factory.binは、wolfBootとtest-appを含んだものになります。
wolfBootの本体とtest-appに使われていないセクタがありますが、ここはmakeしたときにwolfboot.binとimage_v1_signed.binを結合するときに0xFFで埋めてくれています。
Output image(s) successfully created.
[MERGE] factory.bin
Added 20952 bytes at 0x8000000 from wolfboot.bin
Added 110120 bytes of 0xff fill
Added 7428 bytes at 0x08020000 from test-app/image_v1_signed.bin
arch.mk
準備のときにarch.mkに下記を追加しましたが、これはwolfboot.binの先頭アドレスを指定していたことになります。
ifreq ($(TARGET),stm32f401)
ARCH_FLASH_OFFSET=0x08000000
SPI_TARGET=stm32
endif
elfファイル
STM32CubeIDEで、wolfBootを実行するときに、wolfboot.elfとimage.elfのシンボルをダウンロードする設定をしましたが、wolfBootとPrimary(BOOT) partitionでステップ実行するための設定になります。
その他のパーテーション
Secondary(UPDATE) partition, Swapping(SWAP) partitionは、ファームウェアの書き換えのときに使われるようです。
ファームウェアの書き換えについて調べたときに詳細を確認しようと思っています。
ファームウェアイメージヘッダー
ファームウェアの先頭から256バイトには、ファームウェアの情報を格納するためのファームウェアイメージヘッダーが配置されています。
使用方法は分かりませんが、終端の4バイトはパーテーションのマジックナンバーになっているようです。
ファームウェアイメージヘッダーの詳細はドキュメントより下記のようになります。
現在の実装では、ファームウェアイメージヘッダーの内容はドキュメントの内容から少し変わっているようです。
タグタイプ、タグサイズのサイズはドキュメントでは1バイトとなっていますが、実装では2バイト(リトルエンディアン)になっているようです。
パティングの位置も変更されているようです。また、最後の"タグの終了"は現在はないようです。
タグタイプ | 意味 | サイズ |
---|---|---|
0x0001 | バージョン | 4バイト |
0x0002 | タイムスタンプ | 8バイト |
0x0003 | SHA256ダイジェスト | 32バイト |
0x0004 | ? | 2バイト |
0x0010 | ? | 32バイト |
0x0020 | 署名 | 64バイト |
編集後記
今後は、内部の処理についての理解を進めていきたいと思います。