【问题现象】
petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --kernel --force
在使用petalinux-package将uboot、内核和根文件系统等进行打包生成一个BOOT.BIN文件,最后通过Xilinx的SDK或者vivado烧写到QSPI中时,出现以下错误:[ERROR] : Section image.ub.0 offset of 0x520000 overlaps with prior section end address of D19B00
【问题根因与解决方法】
之前,用同样的方法打包一个BOOT.BIN未出现这个错误,唯一不同的点在于两次使用的design_1_wrapper.hdf即FPGA部分的bitstream文件design_1_wrapper.bit不同,前一次正常的时候使用的bit文件大小为1M,后一次的bit文件有13M。
查资料可知,zynq的uboot生成需要加载FPGA部分的硬件信息,可以说.bit文件内的硬件信息将会被写入uboot中。
petalinux的BOOT.BIN生成时,通过petalinux-config可以设置FLASH(BOOT.BIN要写入的FLASH)的分区和大小,在默认情况下,petalinux-config中显示的分区为下图,boot和bootenv的大小为0x520000,而如果.bit文件作为petalinux image的一部分插入(插入到哪里?存疑),0x520000将超出范围,因此需要延长uboot的偏移量。
将partiton 1中的bootenv的大小修改为0x900000,偏移量扩展到0xE00000后,重新编译和打包后,将BOOT.BIN烧写到QSPI中启动即可。
再次prtalinuc-package成功:
【疑问】
为什么要把Flash的bootenv分区大小改为0x900000?如果bit文件是作为uboot的一部分插入的话,应该要改的应该是第一个分区boot的分区大小?而为什么改了bootenv的分区大小却可以了呢?
说明bit文件种的硬件信息是以boot的环境变量的方式被存到bootenv分区中的,所以bit文件的硬件信息越丰富,bootenv就越大,而boot分区种应该只存了uboot启动程序。
uboot在板子中运行后,进入uboot的命令行模式,通过printenv命令打印bootenv相关内容,最后一行的"Environment size: 3410/9437180 bytes"代表什么意思?