ZYNQ - 嵌入式Linux开发 -10- ZYNQ启动流程分析
FSBL启动准备工作
在静态情况下,Boot.BIN启动文件存放在SD卡或QSPI等存储介质中,然后Boot.BIN文件中已经包含了FSBL代码,也就是说FSBL代码已经集成在了Boot.BIN文件中,所以FSBL代码也是存放在Boot .BIN文件中。
如果要启动FSBL代码,就需要完成以下几件事情:
- 找到BOOT.BIN文件所在的位置。
- 从BOOT . BIN文件中找到FSBL代码。
- 找到之后将其拷贝到内存当中( ZYNQ片 内RAM 256K字节大小)。
- 运行FSBL代码。
而以上这些事情由BootROM来去做。
BootROM
何为BootROM?
BootROM它是一个程序/代码,并且已经固话在ZYNQ芯片内部,用于启动的BOOT程序。BootROM代码存放片内ROM当中,所以叫做BootROM。因为ZYNQ内部包含256K RAM 以及128K ROM。所以BootROM代码可以固化在ROM当中,并且在掉电情况下不会丢失。
一般情况下,芯片内部的ROM都是Nor Flash。
NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。
BootROM的作用与功能
BootROM的主要作用用于引导、启动FSBL代码。
它要完成引导、启动FSBL代码的这个任务需要完成以下几件事情(也就是前文提到的FSBL的启动准备工作):
- 找到BOOT.BIN文件所在的位置。
- 从BOOT . BIN文件中找到FSBL代码.
- 找到之后将其拷贝到内存当中(ZYNQ片内RAM 256K字节大小)
- 运行FSBL代码。
为了支持上述的操作,所以BootROM程序需要支持以下功能。
- 包含了SD卡或者QSPI等存储设置的驱动程序。
- BootROM代码支持文件系统操作,至少支持Fat 32这个文件系统。
对于ZYNQ平台的嵌入式Linux系统来说,Linux内核由U-Boot引导、启动;U-Boot由FSBL引导、启动;FSBL由ZYNQ片内BootROM引导、启动。
SD卡加载方式启动流程
在Sd卡启动方式下,BootROM代码的运行流程:
- 初始化MI0引脚,主要配置MIO引脚的物理特性配置寄存器;重点是将MIO40~MIO45复用为SD0外设所对应的CLK/CMD/DATA引脚。
- 初始化SD卡外设,驱动SD卡,可以实现sD卡读写操作。
- 对SD卡读写进行测试。
- 从SD卡文件系统当中读取BOOT. BIN文件,并对BootROM头进行解析。在BOOT.BIN文件前面有一段头部信息,这个头部信息是按照一-定的格式组组织在一起,在这个头部信息当中就包括了fsbl的加载地址、fsbl的 大小以及fsbl在BOOT. BIN文件中的位置偏移量。BootROM代码能够解析这个头部信息
- 得到fsbl代码的大小和位置偏移量以及加载地址之后,BootROM代码就会从BOOT.BIN文件中。将fsbl代码拷贝到RAM内存中,并且跳转到fsbl代码的运行地址去启动fsbl。
自此,BootROM就成功启动了FSBL代码了。
QSPI加载方式启动流程
在QSPI启动方式下,BootROM代码的运行流程:
- 初始化MIO引脚,将相关的MIO引脚复用为QSPI外设所需的引脚功能。
- 初始化QSPI外设,驱动QSPI Flash设备,可以实现QSPI读写操作。
- 对QSPI进行读写测试。
- 从QSPI存储介质中读取BOOT. BIN文件,并对Boot ROM头进行解析。
- 得到fsbl代码的大小和位置偏移量以及加载地址之后,BootROM代码就会从BOOT.BIN文件中。将fsbl代码拷贝到RAM内存中,并且跳转到fsbl代码的运行地址去启动fsbl。
不同于SD卡的文件系统的搜索方式,在QSPI启动方式下,BootROM代码首先会从QSPI的0x000000地址去找BOOT . BIN文件,如果找不到那么就去下一个地址0x008000,如果还找不到他又会跳转到下一个地址0x10000,但是搜索范围不能超出QSPI的前面16MB地址空间。
BOOT.BIN头
BOOT.BIN头是BOOT.BIN文件前面的一段头部数据,并且这个头部数据是按照一定格式组织在一起的, 并且该头部数据能够并BootROM代码所解析。
在BOOT.bin文件中从地址0-0x8FF可以分成17个部分,每个部分都有一定的含义。
- 0x000:中断向量表。
- 0x020:固定值0xaa995566(小端)。
- 0x024:固定值0x584c4e58 ASCII: XLNX。
- 0x028:如果是0xa5c3c5a3或者0x3a5c3c5a为加密的。
- 0x02C:BootROM头版本号,不用管。
- 0x030:此参数包含从有效bootrom头开始到fslb/用户代码映像所在位置的字节数,也就是 FSBL/用户代码的地址偏移量。该地址偏移量必须要大于等于0x8C0。
- 0x034:记录fsbl的长度,用于指导BootROM代码拷贝 fsbl 长度。
- 0x038:将FSBL拷贝到OCM的什么位置一般为0x0,加载地址,指导BootROM代码拷贝FSBL到RAM的哪个位置。
- 0x03C:FSBL在OCM中的运行地址一般定义为0x0,运行地址,指导BootROM代码跳转到RAM哪个地址去运行。
- 0x040:记录FSBL的长度。
- 0x044:为固定值0x01。
- 0x048:校验和(将Ox020-0x047之间的数据按32bit长度进行相加,并取反即可!若相加之后的数据大小超过32bit,则取低32bit 数据进行取反)。
- 0x04C-0x097:fsbl/用户代码自定义,不需要的话可以全部填充为0。
- 0x098:image header table位置偏移量。
- 0x09C:partition header table 的所在位置。
- 0x0A0-0x89F:寄存器初始化的参数。
- 0x8C0:FSBL、用户代码必须要等于或高于此地址。
简述通过BOOT.BIN头如何找到FSBL
BOOT.BIN头部信息当中记录了FSBL代码的位置、大小以及fsbl代码它在RAM内存中的加载地址。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 headelr table;
- partition header table;
- image header。
Image Headelr Table
image header table 只有一个,partition header table和 image header是成对出现的。BOOT.BIN 文件中包含了多少个镜像,那么就有多少对partition header table 和 imageheader。
0x00:image header table 的版本号;
ox04:image header的数量;
0x08:第一个Partition Header table的位置偏移量。这里是以word为单位计算的,所以实际的偏移量需要乘上一个4;
0x0C:第一个Image Header的位置偏移量。采用了word 度量单位;
0x10:header authentication 的偏移量。采用了word为度量单位;
0x1C:使用0xFFFFFFFF进行填充,直到整个image header table的大小为64字节。
Image Header
- 0x0:下一个limage header 的地址偏移量,如果这里填充为0,则表示这是最后一个image header;
- 0x4:与之相关联的partition header table 的位置偏移量;
- 0x8:该地址总是0;
- 0xC:实际分区计数的值;
- 0x10-N:记录镜像名称。
- varies:用于填充。
Partition Header Table
- 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:校验和。
references
- UG585
- UG821
ZYNQ - 嵌入式Linux开发 -10- ZYNQ启动流程分析相关推荐
- ZYNQ - 嵌入式Linux开发 -05- Linux C编程和Makefile
写在前面 本文主要介绍了关于Linux C编程的相关内容以及介绍了Makefile的简单使用教程. VIM编辑器 如果要在终端模式下进行文本编辑或者修改文件就可以使用 VI/VIM 编辑器,Ubunt ...
- 基于Exynos4412的嵌入式Linux的几种启动方式分析
Exynos4412的几种启动方式分析 启动流程分析 BL1(BootLoader)的读入方式 操作系统OS内核的读入方式 小结 启动流程分析 在芯片的iROM中已经固化一个代码,当硬件上电后就读取O ...
- ZYNQ - 嵌入式Linux开发 -06- petalinux设计流程
写在前面 本文主要对petalinux设计流程进行简略介绍. petalinux设计流程介绍 PetaLinux 工具提供了在 Xilinx 处理系统上自定义. 构建和部署嵌入式 Linux 解决方案 ...
- ZYNQ - 嵌入式Linux开发 -07- petalinux工程配置解析
写在前面 前文实现了对一个工程进行了petalinux的镜像制作,对于中间过程的具体配置没有做过多讲解,本文将针对petalinux的配置做进一步的解析. 字符图形界面配置解析 图像界面操作 打开之前 ...
- 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(一) 嵌入式Linux开发基本概念以及开发流程介绍
文章目录 1.linux开发初了解 1.1 嵌入式Linux开发的基本概念 1.1.1关于Git的背景介绍 1.1.2关于repo的背景介绍 1.1 3 一些关于此背景知识的介绍 1.1.4关于Lin ...
- 嵌入式大牛详解:嵌入式linux开发流程总结
很多的小伙伴都私信问了小编在嵌入式学习的过程中都能学到什么,这次小编就顺从大家的意思来一篇嵌入式linux开发的流程,嵌入式linux的学习是不可少的,可以说嵌入式linux是学习比较困难的,会遇到各 ...
- 【嵌入式Linux开发一路清障-连载01】Ubuntu22.04启动U盘制作及系统安装与配置
[嵌入式Linux开发一路清障-连载01]Ubuntu22.04启动U盘制作及系统安装与配置 Ubuntu22.04启动工具 Ubuntu22.04安装 障碍01--Ubuntu中安装搜狗五笔输入法 ...
- 我的嵌入式linux开发步骤
我的嵌入式linux开发步骤: 1. 安装虚拟机,见<安装及使用心得>,选择桥接模式 2. 虚拟机串口设置,见<VMare里linux使用MINCOM通信&g ...
- i.MX8MM嵌入式linux开发指南+全覆盖开发资料
01教程主题 根据多年工作经验总结框架学习法,先掌握整体的开发流程,然后再逐一击破,综合大量工作中的实战案例,在实践中检验理论知识,强化所学知识点,从而掌握Linux的核心技术. 02教学方式 教程由 ...
最新文章
- AAAI 2021放榜:你中了几篇?
- 四年C++老炮,转攻Python实践分享
- 乡村振兴种业使命-丰收节交易会·张桃林:种业谋定格局
- 遇到的JDBC的一个问题
- Linux系统PATH变量配置
- js实现复制粘贴功能
- 为了兴趣爱好,我该选嵌入式么?
- Django 博客教程(三):创建应用和编写数据库模型
- 彼聆智能语音机器人_电销行业的人工智能:智能语音电话机器人
- 【随机过程】马尔可夫链(2)
- U3D-页游-检测机制-webplayer-调试方法
- 2016 年最值得程序员阅读的开源书:《全栈增长工程师指南》
- 用ggsashimi做可变剪切的可视化
- jquery api的整体解读
- 天津城市职业学院计算机国考没过,天津市2019年下半年全国计算机等级考试都有哪些考点可以报名?...
- OpenShift 4 - 用 External Secret 集成 Hashicorp Vault
- shp文件中polyline是什么_shp文件的读取
- Apipost Apifox 真实体验,到底哪个更好用?
- 什么?你还不知道这几款免费又好用的 MySQL 客户端吗?
- 关于Tomcat启动失败的解决方案
热门文章
- 在python中gevent monkey_patch 出现Monkey-patching may lead to errors解决
- mybatis mysql ssh_SSH Mybatis 框架
- 2020年一级计算机考试试题,2020年2016计算机一级考试考点试题
- 植发搞笑图片_植发失败实例:头发没长出来还更秃了?詹姆斯也没能幸免,可怕...
- 微信小程序 map 自定义地图数据,实现方式+思路+代码(最简易的实现方式)
- No valid Maven installation found.
- 【2019.8.9 慈溪模拟赛 T2】摘Galo(b)(树上背包)
- windows环境下用python PyFtdi控制ftdi芯片生成方波信号
- 【食品化学与营养】第一章 绪论 笔记
- MySQL中幻读现象