ブート イメージの作成

ブート イメージ フォーマット (BIF)

ザイリンクスのブート イメージ レイアウトには、ファイル、ファイルの種類、およびサポートするヘッダーが複数あり、これらのファイルはブートローダーによって解析されます。Bootgen は、ブート イメージを生成するための属性を定義し、ファイルで渡された値に基づいて解釈してブート イメージを生成します。使用可能なコマンドと属性は複数あるため、Bootgen はそれらの入力を含むブート イメージ フォーマット (BIF) を定義します。BIF は次のもので構成されています。

  • セキュア/非セキュア ブート イメージを作成するためのコンフィギュレーション属性
  • FSBL (1 つ)
  • 1 つまたは複数のパーティション イメージ

BIF は、ハードウェア要件とソフトウェア要件の両方に対応します。ブート イメージ ヘッダーは、シングル パーティション (通常は FSBL (第 1 段階ブートローダー)) をロードする bootROM ローダーで必要です。その他のブート イメージは、FSBL によってロードされて処理されます。Bootgen は一連のパーティションを組み合わせてブート イメージを生成します。次のパーティションが考えられます。

  • U-Boot といった SSBL (第 2 段階ブートローダー)
  • ビットストリーム
  • Linux
  • プロセッサ上で実行するソフトウェア アプリケーション
  • ユーザー データ
  • Bootgen の生成したブート イメージ

BIF 構文およびサポートされるファイルの種類

BIF ファイルは、ブート イメージの各コンポーネントをブート順に指定し、オプションで各イメージ コンポーネントに属性を適用できるようにします。イメージ コンポーネントがメモリ内で連続していない場合、コンポーネントは複数のパーティションにマップできます。BIF ファイルの構文は次の形式となります。

<image_name>:
{
	// common attributes
	[attribute1] <argument1>   
	 
	// partition attributes
	[attribute2, attribute3=<argument>] <elf>
	[attribute2, attribute3=<argument>, attibute4=<argument] <bit>
	[attribute3] <elf>
	<bin>
}  
  • <image_name> と {...} (グループ化) を使用し、ROM 内のパーティションに分類するファイルをまとめます。
  • {...} には 1 つまたは複数のデータ ファイルがリストされます。
  • 各パーティションのデータ ファイルは、ファイル名の前に構文 [attribute, attribute=<argument>] を使用することで、オプションで属性を持つことができます。
  • 属性によって、データ ファイルに何らかの特性が適用されます。
  • 複数の属性がある場合は、カンマ (,) で区切って並べることができます。その場合の順序は重要ではありません。属性は、1 つのキーワードまたはクォーテーションで囲んだ複数のキーワードとなります。
  • 現在のディレクトリにファイルがない場合は、ファイル名を含むファイル パスを追加できます。ファイルのリスト方法は自由形式で、1 行にすべてをリスト (スペースで区切る、最低 1 スペースは必要) しても、1 つずつと改行してもかまいません。
  • スペースは無視されるため、読みやすいように追加しても問題ありません。
  • C 形式のブロック コメント /*...*/、または C++ 形式の行コメント // を使用できます。

次に、読みやすいように空白と改行を追加した BIF の例を示します。

<bootimage_name>:
{
	/* common attributes */
	 [attribute1] <argument1>   
	 
	/* bootloader */
	 [attribute2, 
	  attribute3, 
	  attribute4=<argument>
	] <elf>
	 
	/* pl bitstream */ 
	[
		attribute2, 
		attribute3, 
		attribute4=<argument>,
		attibute=<argument>
	] <bit>
	 
	/* another elf partition */
	[
		attribute3
	] <elf>
 
	/* bin partition */
	<bin>
}

Bootgen でサポートされるファイル

次の表に、Bootgen でサポートされるファイルを示します。

表 1. Bootgen でサポートされるファイル
サポートされるデバイス 拡張子 説明 注記
すべてのデバイスでサポート .bin バイナリ 未処理のバイナリ ファイル。
.dtb バイナリ 未処理のバイナリ ファイル。
image.gz バイナリ 未処理のバイナリ ファイル。
.elf 実行可能なリンク ファイル (ELF) シンボルとヘッダーを除く。
.int レジスタ初期化ファイル
.nky AES キー
.pk1/.pub/.pem RSA キー
.sig 署名ファイル Bootgen または HSM によって生成される署名ファイル。
Zynq/Zynq UltraScale+ MPSoC/FPGA .bit/.rbt ビットストリーム BIT ファイル ヘッダーを除く。

属性

次の表に、Bootgen の属性を示します。この表では簡単な説明を記載しており、詳細は各属性のリンクをクリックすると参照できます。アーキテクチャ名は、属性を使用するザイリンクス デバイスを示します。

  • zynq: Zynq-7000 SoC デバイス
  • zynqmp: Zynq® UltraScale+™ MPSoC デバイス
  • fpga: Any 7 シリーズおよびそれ以上のデバイス
表 2. Bootgen の属性と説明
オプション/属性 説明 属性を使用するデバイス
aarch32_mode 32 ビット モードで実行されるバイナリ ファイルを指定します。
  • zynqmp
aeskeyfile <aes_key_filepath> AES キー ファイルへのパスです。キー ファイルには、パーティションの暗号化に使用される AES キーが含まれます。ファイルの内容は eFUSE または BBRAM に書き込む必要があります。キー ファイルが指定されたパスに存在しない場合、Bootgen が暗号化に使用される新しいキーを生成します。たとえば BIF ファイルのビットストリームに暗号化を選択した場合、出力は暗号化されたビットストリームとなります。
  • すべて
alignment <byte> バイト アライメントを設定します。パーティションは、この値の倍数値に揃えられるまでパディングされます。この属性はオフセットと共に使用することはできません。
  • zynq
  • zynqmp
auth_params <options> 認証の追加オプションは次のとおりです。
  • ppk_select: 0 = 2 つの PPK のうち 1 つをサポート、1 = 2 つの PPK のうち 1 つをサポート。
  • spk_id: SPK を識別するための 32 ビット ID。
  • spk_select: SPK とユーザー eFUSE を識別。デフォルトは spk-efuse。
  • header_auth: パーティションが認証されていない場合のヘッダーを認証。
  • zynqmp
authentication <option> 認証されるパーティションを指定します。
  • Zynq の認証は、RSA-2048 を使用して実行されます。
  • Zynq UltraScale+ MPSoC の認証は、RSA-4096 を使用して実行されます。
引数は次のとおりです。
  • none: パーティションに署名なし。
  • ecdsa: パーティションは ECDSA を使用して署名。
  • rsa: パーティションは RSA アルゴリズムを使用して署名。
  • すべて
bh_key_iv <filename>

難読化キーまたはブラック キーを復号化する際に使用する初期化ベクター。

  • zynqmp
bh_keyfile <filename>

ブート ヘッダーに格納される 256 ビットの難読化キーまたはブラック キー。これは、[keysrc_encryption]=bh_gry_key または [keysrc_encryption]=bh_blk_key の場合にのみ有効です。

  • zynqmp
bhsignature <filename> ブート ヘッダーの署名を認証証明にインポートします。これは、秘密キー PSK を共有しない場合に使用できます。署名を作成して Bootgen に与えることができます。ファイル フォーマットは bootheader.sha384.sig です。
  • zynqmp
big_endian バイナリ ファイルをビッグ エンディアン形式に指定します。
  • zynqmp
blocks <block sizes> 暗号化におけるキー ローリング機能のブロック サイズを指定します。各モジュールは独自のキーを使用して暗号化されます。最初のキーはデバイスのキー ソースで格納され、後続の各ブロックのキーは直前のモジュール内で暗号化 (ラップ) されます。
  • zynqmp
boot_device <options> セカンダリ ブート デバイスを指定します。パーティションが存在するデバイスを示します。オプションは次のとおりです。
  • qspi32
  • qspi24
  • nand
  • sd0
  • sd1
  • sd-ls
  • sdls
  • mmc
  • usb
  • ethernet
  • pcie
  • sata
注記: これらのオプションは、Bootgen のさまざまなデバイスでサポートされます。デバイスでサポートされるセカンダリ ブート デバイスのリストについては、該当するデバイスのテクニカル リファレンス マニュアルを参照してください。
  • zynqmp
bootimage <filename.bin> リストされた入力ファイルが Bootgen によって作成されたブート イメージであることを示します。
  • zynq
  • zynqmp
bootloader <partition>

パーティションがブートローダー (FSBL) であることを指定します。この属性は、ほかのパーティションの BIF 属性と共に指定されます。

  • zynq
  • zynqmp
bootvector <vector_values> XIP (eXecute In Place) のベクター テーブルを指定します。
  • zynqmp
checksum <options> パーティションのチェックサムが必要であることを指定します。このオプションを認証や暗号化などのよりセキュアな機能と共に使用することはできません。チェックサム アルゴリズムは次のとおりです。
  • md5: Zynq®-7000 SoC デバイスの場合。
  • none: Zynq® UltraScale+™ MPSoC の場合。チェックサムなし。
  • sha3: sha3 チェックサム。
注記:
  • Zynq デバイスでは、ブートローダーのチェックサムはサポートされません。
  • Zynq UltraScale+ MPSoC デバイスでは、ブートローダーのチェックサムがサポートされます。
  • zynq
  • zynqmp
destination_device <device_type> パーティションのターゲットを PS または PL のいずれかに指定します。次のオプションがあります。
  • ps: パーティションのターゲットは PS (デフォルト)。
  • pl: パーティションのターゲットは PL (ビットストリームの場合)。
  • zynqmp
destination_cpu <device_core> パーティションを実行するコアを指定します。
  • a53-0
  • a53-1
  • a53-2
  • a53-3
  • r5-0 (デフォルト)
  • r5-1
  • pmu
  • r5-lockstep
  • zynqmp
early_handoff このフラグは、パーティションのロード直後に重要なアプリケーションへのハンドオフが確実に実行されるようにします。このオプションを使用しない場合は、最初にすべてのパーティションが順にロードされ、続いてハンドオフが順に実行されます。
  • zynqmp
encryption <option> 暗号化するパーティションを指定します。使用される暗号化アルゴリズムは、Zynq の場合は AES-CBC、Zynqmp の場合は AES-GCM です。
パーティションのオプションは次のとおりです。
  • none: パーティションは暗号化されない。
  • aes: パーティションは AES アルゴリズムを使用して暗号化される。
  • すべて
exception_level <options> コアに設定する例外レベルを指定します。
オプションは次のとおりです。
  • el-0
  • el-1
  • el-2
  • el-3
  • zynqmp
familykey ファミリ キーを指定します。
  • zynqmp
  • fpga
fsbl_config ブート イメージのコンフィギュレーションに使用するサブ属性を指定します。サブ属性は次のとおりです。
  • bh_auth_enable: PPK ハッシュと SPK ID の検証を除き、ブート イメージの RSA 認証が完了しました。
  • auth_only: ブート イメージは RSA 署名のみです。FSBL の復号化は実行しません。
  • opt_key: block-0 の復号化に操作キーを使用します。操作キーはセキュア ヘッダーにあります。
  • pufhd_bh: PUF ヘルパー データはブート ヘッダーに格納されます。(デフォルトは efuse)。
  • PUF ヘルパー データ ファイルは、[puf_file] オプションを使用して Bootgen に渡されます。
  • puf4kmode: PUF は 4k ビット コンフィギュレーションでの使用に合わせて調整されています。デフォルトは 12k ビットです。
  • shutter = <value>: <value> は 32 ビットの PUF_SHUT レジスタの値で、シャッター オフセット時間およびシャッター オープン時間を PUF に設定します。
  • zynqmp
headersignature <signature_file> ヘッダーの署名を認証証明にインポートします。これは、秘密キーを共有しない場合に使用できます。署名を作成して Bootgen に与えることができます。
  • zynq
  • zynqmp
hivec 例外ベクター テーブルの場所を hivec (Hi-Vector) として指定します。デフォルトは lovec (Low-Vector) です。これは、A53 (32 ビット) および R5 コアにのみ適用されます。
  • hivec: 0xFFFF0000 の例外ベクター テーブル。
  • lovec: 0x00000000 の例外ベクター テーブル。
  • zynqmp
init <filename> ブートローダーの最後にあるレジスタ初期化ブロックであり、init (.int) ファイルの仕様を解析して構築されます。最大 256 のアドレスと値の初期化ペアが許可されます。init ファイルには特定のフォーマットがあります。
  • zynq
  • zynqmp
keysrc_encryption 暗号化に使用するキー ソースを指定します。キーは次のとおりです。
  • efuse_gry_key: eFUSE に格納されているグレー (難読化) キー。グレー/難読化キー 参照
  • bh_gry_key: ブート ヘッダーに格納されているグレー (難読化) キー。
  • bh_blk_key: ブート ヘッダーに格納されているブラック キー。ブラック キー/PUF キー 参照
  • efuse_blk_key: eFUSE に格納されているブラック キー。
  • kup_key: ユーザー キー。
  • efuse_red_key: eFUSE に格納されているレッド キー。キーの差し替え 参照
  • bbram_red_key: BBRAM に格納されているレッド キー。
  • zynq
  • zynqmp
load <partition_address> メモリ内のパーティションのロード アドレスを設定します。
  • zynq
  • zynqmp
offset <offset_address> ブート イメージ内のパーティションの絶対オフセットを設定します。
  • zynq
  • zynqmp
partition_owner <option> パーティションをロードするパーティション オーナー。オプションは次のとおりです。
  • fsbl: パーティションは FSBL によってロードされます。
  • uboot: パーティションは U-Boot によってロードされます。
  • zynq
  • zynqmp
pid <ID> パーティション ID を指定します。PID は 32 ビット値 (0〜0xFFFFFFFF) に設定できます。
  • zynqmp
pmufw_image <image_name> FSBL をロードする前に bootROM によってロードされる PMU ファームウェア イメージです。
  • zynqmp
ppkfile <key filename> プライマリ公開キー (PPK)。ブート イメージ内のパーティションの認証に使用します。

詳細は、認証の使用 を参照してください。

  • zynq
  • zynqmp
presign <sig_filename> パーティション署名 (.sig) ファイル。
  • すべて
pskfile <key filename> プライマリ秘密キー (PSK)。ブート イメージ内のパーティションの認証に使用します。

詳細は、認証の使用 を参照してください。

  • zynq
  • zynqmp
puf_file <filename> PUF ヘルパー データ ファイル。PUF は、暗号化キー ソースとしてブラック キーと共に使用されます。PUF ヘルパー データは 1544 バイトです。1536 バイトの PUF HD + 4 バイトの HASH + 3 バイトの AUX + 1 バイト アライメント。
  • zynqmp
reserve パーティションのメモリ サイズを維持します。このサイズになるまでパーティションにパディングが追加されます。
  • zynq
  • zynqmp
spk_select <SPK_ID> ユーザー eFUSE の SPK ID を指定します。
  • zynqmp
spkfile <filename> ブート イメージ内のパーティションの認証に使用するキーです。詳細は、認証の使用を参照してください。SPK - セカンダリ公開キー。
  • すべて
spksignature <signature_file> SPK の署名を認証証明にインポートします。認証の使用を参照してください。これは、秘密キー (PSK) を共有しない場合に使用できます。署名を作成して Bootgen に与えることができます。
  • zynq
  • zynqmp
split <options> モードに基づいてイメージを分割します。split オプションは次のとおりです。
  • slaveboot: zynqmp でのみサポートされています。次のように分割します。
  • ブート ヘッダー + ブートローダー
  • イメージ ヘッダーおよびパーティション ヘッダー
  • 残りのパーティション
  • normal: zynq および zynqmp の両方でサポートされています。次のように分割します。
  • ブート ヘッダー + イメージ ヘッダー + パーティション ヘッダー + ブートローダー
  • パーティション 1
  • パーティション 2、以下同様

分割 (split) モードのほかに、出力フォーマットも bin または mcs に設定できます。

注記: オプションの split の normal モードは、コマンド ライン オプションの split と同じです。このコマンド ライン オプションは推奨されていません。
  • zynq
  • zynqmp
sskfile <key filename> セカンダリ秘密キー (SSK) は、ブート イメージ内のパーティションを認証するために使用されます。プライマリ キーはセカンダリ キーを認証し、セカンダリ キーはパーティションを認証します。
  • すべて
startup=<address> ロード後のパーティションのエントリ アドレスを設定します。この識別子は、実行しないパーティションでは無視されます。
  • zynq
  • zynqmp
TrustZone= <option>
TrustZone オプションは次のとおりです。
  • secure
  • nonsecure
  • zynqmp
udf_bh <data_file> ブート ヘッダーのユーザー定義フィールドにコピーされるデータのファイルをインポートします。UDF は、16 進数文字列フォーマットのテキスト ファイルで提供されます。UDF の総バイト数は、zynq = 76 バイトで、zynqmp = 40 バイトです。
  • zynq
  • zynqmp
udf_data <data_file> 最大 56 バイトのデータを含むファイルを認証証明のユーザー定義フィールド (UDF) にインポートします。
  • zynq
  • zynqmp
xip_mode FSBL が QSPI フラッシュから直接実行されるよう XIP (eXecute-In-Place) を示します。
  • zynq