ZYNQ启动流程分析之BOOT.BIN头
一、什么是BOOT.BIN头BOOT.BIN头其实就是BOOT.BIN文件前面的一段头部数据,并且这个头部数据是按照一定格式组织在一起的,并且该头部数据能够并BootROM代码所解析。二、BOOT.BIN头格式介绍在boot.bin文件中从地址0-0x8FF可以分成17个部分,每个部分都有一定的含义0x000 中断向量表0x020 固定值 0xaa9955660x024 固定值 0x584c4e5
一、什么是BOOT.BIN头
BOOT.BIN头其实就是BOOT.BIN文件前面的一段头部数据,并且这个头部数据是按照一定格式组织在一起的,并且该头部数据能够并BootROM代码所解析。
二、BOOT.BIN头格式介绍
在boot.bin文件中从地址0-0x8FF可以分成17个部分,每个部分都有一定的含义
- 0x000 中断向量表
- 0x020 固定值 0xaa995566
- 0x024 固定值 0x584c4e58 ASCII: XLNX
- 0x028 如果是0xa5c3c5a3或者0x3a5c3c5a为加密的
- 0x02C bootrom头版本号,不用管
- 0x030 此参数包含从有效bootrom头开始到fslb/用户代码映像所在位置的字节数,也就是fsbl/用户代码的地址偏移量。该地址偏移量必须要大于等于0x8C0,原因就很简单了!
- 0x034 记录fsbl的长度,用于指导BbootROM代码拷贝fsbl长度
- 0x038将fsbl拷贝到OCM的什么位置 一般为0x0 加载地址 指导BootROM代码拷贝fsbl到SRAM内存中的哪个位置。
- 0x03C fsbl在OCM中的运行地址一般定义为0x0 运行地址 指导BootROM代码跳转到SRAM的哪个地址去运行fsbl(去启动)
- 0x040 同7
- 0x044 0x01为固定值
- 0x048 校验和(将0x020-0x047之间的数据按32bit长度进行相加,并取反即可!若相加之后的数据大小超过32bit,则取低32bit数据进行取反)
- 0x04C~0x097 fsbl/用户代码自定义,不需要的话可以全部填充为0
- 0x098 image header table 位置偏移量 image header table的位置
- 0x09C 记录了第一个partition header table的所在位置
- 0x0A0~0x89F 寄存器初始化的参数
- 0x8C0 fsbl、用户代码必须要等于或高于此地址
三、通过BOOT.BIN头如何找到FSBL
BOOT.BIN头部信息当中记录了fsbl代码的位置、大小以及fsbl代码它在SRAM内存中的加载地址。
0x30地址记录了fsbl代码在BOOT.BIN文件中的位置偏移量
0x34记录了fsbl代码的长度
0x38记录了fsbl代码在SRAM中的加载地址
BootROM代码解析到这些信息之后,就会从fsbl代码的位置偏移量去读取0x34地址中记录的大小,然后把它拷贝到fsbl代码的加载地址中。
最后跳转到0x3C地址中记录的fsbl的运行地址中去启动fsbl。
四、通过BOOT.BIN如何找到U-Boot和bitstream
BOOT.BIN文件当中包含了fsbl镜像+u-boot镜像以及bitstream文件
BootROM代码需要通过解析BOOT.BIN头部信息去找到fsbl。
BootROM代码启动fsbl之后它的使命就完成了。
fsbl代码运行之后,要负责从BOOT.BIN文件中找到U-Boot镜像和bitstream文件
然后把bitstream文件加载到ZYNQ PL端,然后要启动U-Boot。
首先这里需要涉及到三个数据表: image header table、partition header table以及image header。
image header table只有一个,partition header table 和 image header 是成对出现的
BOOT.BIN文件中包含了多少个镜像,那么就有多少对partition header table 和 image header。
(本节内容可以参考xilinx文档 UG821)
1.image header table(只有一个)
0x0: image header table 的版本号;
0x4: image header的数量;
0x8: 第一个Partition Header table的位置偏移量。注意这里是以word为单位计算的,所
以实际的偏移量需要乘上一个4;
0xC: 第一个Image Header的位置偏移量。同理也是采用了word度量单位;
0x10: header authentication的偏移量。同理也是采用了word为度量单位;
0x1C: 使用0xFFFFFFFF进行填充,直到整个image header table的大小为64字节。
image header
0x0: 下一个image header的地址偏移量,如果这里填充为0,则表示这是最后
一个image header;
0x4: 与之相关联的partition header table的位置偏移量;
0x8: 该地址总是0;
0xC: 实际分区计数的值;譬如我在制作BOOt.BIN文件的时候,使用fsbl镜像的名字是zynq_fsbl.elf
0x10~N: image的名字。
partition header table
在partition header table数据表当中就有一些比较重要的信息了,譬如镜像的大小、加载地址、运行地址、在BOOT.BIN文件中位置偏移量等等。
0x0: 加密分区的数据长度;单位是字 计算时必须要乘上4
0x4: 未加密分区的数据长度,例如该分区是u-boot,则指示了u-boot的长
度;计算时同上;
0x8: 加密+填充+扩展+身份验证的数据总长度;
0xC: 该分区数据的加载地址,指的是该分区数据需要拷贝到内存的什么位置;
0x10: 该分区数据的运行地址,指运行该分区代码时需要跳转到那个内存地址;
0x14: 该分区数据在BOOT.BIN文件中的位置偏移量,拷贝的时候就是从该地址进行拷贝的;
0x18: 属性位;
0x1C: Section计数;
0x20: 校验和字段的位置;
0x24: 该partition header table所对应的image header所在位置。以word字为单位;
0x28: 加密相关的字段;
0x2C~0x38: 未定义;
0x3C: 校验和;
fsbl镜像的信息可以通过BOOT.BIN头部信息去找到,也可以通过fsbl所对应的partition header table找到。
五、启动方式配置
ZYNq支持多种不同的启动方式,譬如包括:QSPI、NAND、Nor、SD、JTAG
领韩者开发板或启明星开发板 底板上有一个红色拨码开关,这个开关就是用来配置开发板启动方式, 领韩者开发板或启明星开发板支持3种启动方式设置: QSPI、SD以及JTAG。
更多推荐
所有评论(0)