Zynq > BOOT.binの解析 > M. Boot.binの構造 (情報源はbootgen.py)

```txt:動作環境
PetaLinux 2014.4
Vivado v2014.4
MicroZed
```

2014年頃のメモより。

以下の名前はbootgen.pyの定義を使っている。
以下において.bit.binは.bitファイルを arm-xilinx-eabi-objcopy -O binary により.bin形式に変換したものを表す。
値はlittle endianで格納されるので、0x1234の値はバイナリエディタで見た時は「 34 12 」のようになる。

0x00 から 0x8BF > **boot_header**
<details><summary>ここをクリックすると展開されます...</summary>0x00 から > L x 8 > LOOP_CODE (=0xEAFF FFFE) を8個
0x20 から 0x23 > WIDTH_DETECTION (例: 0xAA995566: 同期ワード)
0x24 から 0x28 > 4文字 > IMAGE_ID (例: XNLX)
0x28 から 0x30 > LL (2バイト x 2) > 0101 0000 (device address of EEPROMのようだ)
0x30 から 0x33 > L > source_offset (例: 0x1700 )
0x34 から 0x37 > L > image_length (例: 0x1800C )
0x38 から 0x3B > L > 0
0x3C から 0x3F > L > start_of_execution (例: 0)
0x40 から 0x43 > L > total_image_length
0x44 から 0x47 > L > 1
0x48 から 0x4B > L > ~(checksum & 0xffffffff) & 0xffffffff)
から 0x8F > 0x00で埋める
0x90 から 0x93 > L > 0
0x94 から 0x97 > L > 0
0x98 から 0x9B > L > 0x000008c0
0x9C から 0x9F > L > 0x00000c80
0xA0 から 0x89F > (0xffffffff, 0x00000000)で埋める
0x8A0 から 0x8BF > 0xFFで埋める</details>

 
0x8C0 から 0x08FF > **image_header_table**
<details><summary>ここをクリックすると展開されます...</summary>0x8C0 から 0x8C3 > L (2バイト) > IMAGE_HEADER_TABLE_VERSION (例: 0x0102 0000)
0x8C4 から 0x8C7 > L > image_header_n (例: 3)
0x8C8 から 0x8CB > L > partition_header_offset (例: 0x320)
0x8CC から 0x8CF > L > image_header_offset (例: 0x240)
0x8D0 から 0x8D3 > L > authentication_offset (例: 0x0)
から 0x8FF > 0xFFで埋める</details>
 
0x900 から 0x93F > **image_header** "FSBLファイルのヘッダ"
<details><summary>ここをクリックすると展開されます...</summary>0x900 から 0x903 > L > next_image_header_offset (例: 0x250)
0x904 から 0x907 > L > partition_header_offset (例: 0x320)
0x908 から 0x90B > L > parition_n (例: 0)
0x90C から 0x90F > L > image_length (例: 1)
0x910 から 0x923 > ファイル名 (後ろは0x00で埋める)
から 0x93F > 0xFFで埋める</details>
0x940 から 0x97F > **image_header** ".bit.binファイルのヘッダ"
0x980 から 0x9BF > **image_header** "HellowWorldファイルのヘッダ"
0x9C0 から 0xC7F > 0xFFで埋める
0xC80 から 0xCBF > **partition_header_table** (64バイト) "FSBLファイルのヘッダ"
<details><summary>ここをクリックすると展開されます...</summary>0xC80 から 0xC83 > L > partition_data_word_len (例: 24579)
0xC84 から 0xC87 > L > **extracted_data_word_len** (例: 24579)
0xC88 から 0xC8B > L > **total_data_word_len** (例: 24579)
0xC8C から 0xC8F > L > **destination_load_addr** (例: 0)
 
0xC90 から 0xC93 > L > **destination_exec_addr** (例: 0, 0, 1048576 for FSBL, .bit, アプリ )
0xC94 から 0xC97 > L > **data_word_offset** (例: 1472, 26064, 547008 for FSBL, .bit, アプリ)
0xC98 から 0xC9B > L > **attribute** (例: PARTITION_ATTRIBUTE_PS(=0x10) for FSBL, アプリ / PARTITION_ATTRIBUTE_PL(=0x20) for .bit)
0xC9C から 0xC9F > L > **section_n** (例: 1 for FSBL, .bit, アプリ)
 
0xCA0 から 0xCA3 > L > **check_sum_word_offset** (例: 0 for FSBL, .bit, アプリ)
0xCA4 から 0xCA7 > L > **image_header_word_offset** (例: 576, 592, 608 for FSBL, .bit, アプリ)
0xCA8 から 0xCAB > L > 0x00を入れる
0xCAC から 0xCAF > L > 0x00を入れる
 </details>
0xCC0 から 0xCFF > **partition_header_table** (64バイト) ".bit.binファイルのヘッダ"
0xD00 から 0xD3F > **partition_header_table** (64バイト) " HellowWorldファイルのヘッダ "
0xD40 から 0xD7F > **partition_header_table** (64バイト) " (undocumented) "
0xD80 から 0x16FF > 0xFFで埋める
0x1700 から > **FSBLのデータ** : 0x1700は boot_header.source_offsetに格納されている
0x1970C から 0x1973F > 0xFFで埋める
0x19740 から > **.bit.binのデータ** : 0x19740の計算は 0x1700 + ((image_word_length + 15) & ~15) ここで image_word_length = boot_header.image_length / 4
0x2162DC から 0x2162FF > 0xFFで埋める
0x216300 から > **HelloWorldのデータ** : 0x216300の計算は 0x19740 + ((image_word_length1 + 15) & ~15) ここで image_word_length1 = path.getsize(bit_file_bin) / 4 
0x21E30C から 0x2220816 > 0xFFで埋める