Zynq 7000 系列中的BootROM流程及BootROM Header简介

BootROM Code是在系统复位后执行的一段代码,用于配置PS(处理器系统)。本文将详细解释BootROM的启动过程及BootROM Header的格式。

1 BootROM流程

Zynq 7000在系统复位后进行配置。整个启动过程在图6-1中进行了说明,而BootROM的执行过程则在图6-5中展示。CPU 0执行BootROM代码,同时禁用DAP和TAP JTAG控制器。BootROM并不初始化DDR内存控制器和其他外设。
在这里插入图片描述
PL的上电和初始化序列可以与PS的启动并行进行,也可以在PS启动后进行。如果BootROM需要PL上电,那么在BootROM执行的早期阶段,BootROM会向devcfg.CTRL [PCFG_PROG_B]位写入数据,并等待devcfg.STATUS [PCFG_INIT]位断言后再继续执行BootROM。

PL电源对于PCAP访问和镜像解密是必要的。在访问其资源之前,BootROM会测试PL的状态,并使用90秒的超时时间。在启动过程中,PROGRAM_B设备引脚必须保持高位。如果在启动过程中将PROGRAM_B设备引脚保持低位,将导致设备锁定事件。

在BootROM的执行过程中,CPU 0按照预定的程序流程执行代码,确保系统按照正确的顺序和条件进行初始化。这包括了与PL的交互,以及对各种资源的访问和配置。如果任何步骤出现问题或超时,BootROM可能会返回错误代码或进入错误处理流程。

1.1 安全与非安全启动

出于安全考虑,在所有PS内部的主模块中,CPU 0始终是第一个退出复位状态的设备。CPU 1则被保持在WFE(等待事件)状态。当BootROM运行时,JTAG总是被禁用,无论复位类型如何,以确保安全性。在BootROM运行完毕后,如果启动模式为非安全模式,JTAG才会被启用。

BootROM代码还负责加载FSBL(第一阶段引导加载程序)/用户代码。当BootROM将控制权释放给第一阶段时,用户软件将接管整个系统的控制权。要再次执行BootROM,只能通过生成系统复位之一来实现。FSBL/用户代码的大小,无论是加密还是未加密,都限制在192 KB以内。这一限制不适用于非安全就地执行选项。

PS的启动源是通过BOOT_MODE绑定引脚(由弱上拉或下拉电阻指示)来选择的,这些引脚在电源上电复位(POR)期间被采样一次。采样值存储在slcr.BOOT_MODE寄存器中。

BootROM支持加密/验证和未加密的图像,分别称为安全启动和非安全启动。

当使用execute-in-place选项时,BootROM支持直接从NOR或Quad-SPI执行第一阶段图像,但仅限于非安全启动图像。execute-in-place仅适用于NOR和Quad-SPI启动模式。

在安全启动中,运行BootROM代码的CPU会对启动设备上的用户PS图像进行身份验证和解密,将其存储在OCM(片上存储器)中,然后跳转到该图像。

在非安全启动中,运行BootROM代码的CPU在跳转到OCM内存或闪存设备中的用户图像之前,会禁用所有安全启动功能,包括PL内的AES单元(如果使用了就地执行)。

无论是PS还是PL,其后续的所有启动阶段均由您负责并处于您的控制之下。BootROM代码对您是不可访问的。在第一阶段安全启动之后,您可以选择进行安全或非安全的后续启动阶段。而如果在第一阶段进行了非安全启动,那么后续阶段只能是非安全的启动。

1.2 启动源

存在五种可能的启动源:NAND、NOR、SD卡、Quad-SPI和JTAG。前四个启动源用于主启动方法,其中CPU从非易失性存储器中将外部启动映像加载到PS中。

JTAG是从属启动模式,仅支持非安全启动。外部主机计算机作为主设备,通过JTAG连接将启动映像加载到OCM中。在加载启动映像时,PS CPU保持空闲模式。

1.3 APU初始化

BootROM配置APU和MIO多路复用器以支持启动过程。BootROM使用CPU 0来执行ROM代码,而CPU 1执行WFE指令。缓存和TLB被无效化。BootROM配置MMU和其他系统资源以满足BootROM执行的需求。APU的状态在Post BootROM State部分有描述。

FSBL/用户代码和操作系统软件必须根据自己的需求配置APU。

2 BootROM Header

对于所有的主启动模式(闪存设备),BootROM都需要一个Header。然而,在JTAG从属启动模式下,BootROM Header并不被使用,并且BootROM代码不会加载FSBL/User代码。

BootROM Header的参数在表6-5中列出,包括它们的字号、字节地址偏移以及它们对于三种设备启动模式的适用性。
在这里插入图片描述
2.1 执行原地的中断表 — 0x000 到 0x01C

此区域预留了八个32位字用于中断映射。这对于NOR和Quad-SPI设备的执行原地(execute-in-place)特别有用。它允许以两种方式管理CPU向量表:

①使用MMU(内存管理单元)将flash线性地址空间重映射到0x0。
②使用协处理器VBAR寄存器来管理向量表的位置。

2.2 宽度检测 — 0x020

对于Quad-SPI启动模式,需要进行宽度检测。确保BootROM Header包含值0xAA995566,这样BootROM就能确定flash设备(们)的最大硬件I/O数据连接宽度。这个值有助于BootROM确定单个Quad-SPI设备(x1、x2或x4)的数据宽度,并检测8位并行I/O配置中的第二个设备。如果Quad-SPI启动模式没有这个值,BootROM会锁定系统并生成错误代码。

2.3 映像标识 — 0x024

此字有一个强制性的值0x584C4E58,即’XLNX’。这个值允许BootROM(连同Header校验和字段)确定是否存在有效的BootROM Header。如果值不匹配,在Quad-SPI、NAND或NOR启动模式下,BootROM代码会执行Header搜索。如果启动模式是SD卡,BootROM会锁定系统并生成错误代码。

2.4 加密状态 — 0x028

加密状态决定启动是安全的(启动映像已加密)还是非安全模式。此字段的有效值为:

• 0xA5C3C5A3:已加密的FSBL/User代码(需要eFUSE密钥源)。
• 0x3A5C3C5A:已加密的FSBL/User代码(需要电池支持的RAM密钥源)。
• 非0xA5C3C5A3或0x3A5C3C5A:未加密的FSBL/User代码(无密钥)。

eFuse的状态和加密状态字决定了加密密钥的来源(如果有的话)。有效的组合显示在表6-6中。
在这里插入图片描述
加密状态字段用于指示FSBL/User代码的加密状态,并确定加密密钥的来源。在安全的启动过程中,确保使用正确的密钥对代码进行加密和解密是至关重要的,以防止未经授权的访问和篡改。

2.5 FSBL/User Defined — 0x02C

该字段用于存储BootROM Header版本。

2.6 Source Offset — 0x030

此参数包含从有效BootROM Header开始到FSBL/User代码映像所在位置的字节数。这个偏移量必须对齐到64字节边界,并且必须从BootROM Header开始的地址偏移量0x8C0或更大。

2.7 Length of Image — 0x034

此字段包含要传输到OCM(On-Chip Memory,片上存储器)的加载映像的字节数。对于非安全模式,映像长度等于总映像长度参数,并且最大值为192KB。对于安全模式,映像长度等于经过身份验证和解密处理步骤后的映像长度。在这种情况下,由于加密开销,映像长度总是小于192KB。

当Quad-SPI或NOR闪存模式中的值为零时,BootROM将从关联的闪存设备中执行FSBL/User代码,而无需将映像复制到OCM(即原位执行)。

2.8 FSB Load Address — 0x038

此地址用于将FSBL(First Stage Boot Loader,第一阶段引导加载程序)复制到目标地址。

2.9 Start of Execution — 0x03C

这个字段定义了FSBL/User代码开始执行的内存地址。对于从OCM执行的代码,这个地址是相对于系统内存起始地址的,并且需要满足特定的对齐要求。在非安全模式下,这个地址有一个确定的范围,而在安全模式下,这个地址必须是0x0。对于原位执行的情况,地址需要指向特定大小的内存范围内,这取决于使用的启动模式(Quad-SPI或NOR)。

2.10 Total Image Length — 0x040

这个字段表示从闪存中加载到OCM(片上存储器)的总字节数。对于非安全启动,Total Image Length参数必须设置为与Length of Image参数相等。对于安全映像,Total Image Length参数包括HMAC头部、加密开销和对齐要求,并且总是大于Length of Image参数。Total Image Length参数由设计工具提供。

2.11 QSPI Config Word — 0x044

QSPI配置字,硬编码为0x01。这个字段用于配置QSPI(四线SPI)接口的相关参数。

2.12 Header Checksum — 0x048

这是Header的校验和值,在使用Header内的数据之前会进行检查。校验和是通过将0x020到0x044之间的字相加并取反结果计算得出的。

2.13 FSBL/User Defined — 0x04C to 0x097

这个区域可以在Bootgen中使用BIF文件的udf_bh字段。

2.14 Boot Header Table Offset — 0x098

指向映像头部表的指针。

2.15 QSPI Config Word — 0x09C

指向分区Header表的指针。这里提到的QSPI配置字与0x044处的配置字可能具有不同的用途或上下文,具体取决于系统的设计和实现。

2.16 Register Initialization Parameters — 0x0A0 to 0x89C

这个区域包含256对地址和数据字,可用于在访问FSBL/User代码之前初始化PS(处理系统)寄存器,例如用于MIO多路复用器、启动设备时钟和其他功能的寄存器。这些寄存器写入通常用于优化启动设备接口并设置其时钟频率以最大化性能。

寄存器初始化对包含两个32位字,首先是寄存器地址,然后是寄存器写入值。寄存器初始化可以以任何顺序进行,并且同一个寄存器可以根据需要被初始化为不同的值多次。寄存器初始化在复制FSBL/User代码之前进行,这样用户就可以修改默认的复位寄存器值,以减少访问代码和处理代码的时间。

BootROM在处理寄存器初始化列表时,会在地址寄存器为0xFFFF_FFFF或列表结束(256个地址/写入数据对)时停止。

2.17 FSBL/User Defined — 0x8A0 - 0x8BF

这段内存区域可以被FSBL(First Stage Boot Loader,第一阶段引导加载程序)或用户代码使用。

2.18 FSBL Image or User Code Start Address — 0x8C0

FSBL映像或用户代码必须从这个位置开始或在该位置之上。这个位置由Source Offset参数指向,并且必须对齐到64字节。

这里提到的FSBL是引导加载过程的一个阶段,通常用于初始化硬件、配置内存等,以便能够加载并执行更高级别的代码。User Code通常指的是在FSBL之后执行的应用程序或操作系统代码。

Source Offset参数用于指定FSBL映像或用户代码在引导加载器生成的二进制映像中的偏移量。通过这个参数,可以确保FSBL或用户代码从正确的内存地址开始。

对齐到64字节是为了确保代码在内存中的布局符合某些硬件或系统的要求,这通常可以提高性能或满足特定的访问模式。如果代码没有正确对齐,可能会导致性能下降或系统不稳定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/315858.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

公司服务器中的kafka消息中间件挂了,我是如何修复的?

今天的公司的system系统服务在运行过程中,提示连接不上kafuka的消息中间件。但是负责kafka的同事已经离职了,询问公司开发也不知道如何处理,我是如何重启kafka消息中间件使system系统服务正常运行? 查看kafka的安装位置 在下面的…

高扬程水泵的性能与应用领域 /恒峰智慧科技

在现代社会中,科技的发展为我们的生活带来了无数便利和可能性。其中,高扬程水泵作为一种高效能的水泵,其独特的设计使其在各个领域都有着广泛的应用,尤其是在森林消防中。 一、高扬程水泵的性能 1. 高扬程:高扬程水泵…

制造型企业 如何实现便捷的机台文件统一管理?

机台文件统一管理,这是生产制造型企业都需要去做的,机台文件需要统一管理的原因主要包括以下几点: 1、提高效率:统一管理可以简化文件的访问和使用过程,提高工作效率,尤其是在需要频繁访问或更新机台文件的…

在 Vue 中预加载组件

在 Vue 中,利用 VueRouter 可以轻松的实现两个组件(页面)之间的切换,有个常用的设计就是需要在登录页登录后跳转至一个内容页,通常的做法是在登录校验完成之后立即切换路由至内容页,接着内容页发送网络请求…

SpringBoot (批量)生成二维码工具类多种方法示例

一、引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version> </dependency><dependency><groupId>com.google.zxing</groupId><artifactId…

Jmeter05:配置环境变量

1 Jmeter 环境 1.1 什么是环境变量&#xff1f;path什么用&#xff1f; 系统设置之一&#xff0c;通过设置PATH&#xff0c;可以让程序在DOS命令行直接启动 1.2 path怎么用 如果想让一个程序可以在DOS直接启动&#xff0c;需要将该程序目录配置进PATH 1.3 PATH和我们的关系…

【自然语言处理】InstructGPT、GPT-4 概述

InstructGPT官方论文地址&#xff1a;https://arxiv.org/pdf/2203.02155.pdf GPT-4 Technical Report&#xff1a;https://arxiv.org/pdf/2303.08774.pdf GPT-4&#xff1a;GPT-4 目录 1 InstructGPT 2 GPT-4 1 InstructGPT 在了解ChatGPT之前&#xff0c;我们先看看Instr…

Three.js--》探秘虚拟现实VR展厅的视觉盛宴

今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 源码下载地址&#xff1a;地址 在线体验地址&#xff1a;地址 目录 项目搭建 初始化three代码 camera…

分布式系统事务一致性解决方案(基于事务消息)

参考&#xff1a;https://rocketmq.apache.org/zh/docs/featureBehavior/04transactionmessage/ 文章目录 概要错误的方案方案一&#xff1a;业务方自己实现方案二&#xff1a;RocketMQ 事务消息什么是事务消息事务消息处理流程事务消息生命周期使用限制使用示例使用建议 概要 …

单纯形投影算法

目录 一&#xff0c;任意点到平移坐标轴面的投影 1&#xff0c;求解目标 2&#xff0c;转换变量 3&#xff0c;求解结果 4&#xff0c;f(t)的导数 5&#xff0c;f(t)的最小值 二&#xff0c;任意点到标准单纯形的投影 1&#xff0c;求解目标 2&#xff0c;公式变形 3…

制作一个RISC-V的操作系统十四-任务同步和锁

文章目录 并发与同步临界区和锁锁死锁解决死锁自旋锁&#xff08;spin lock&#xff09;原子性问题原子操作实现amoswap.w.aq例子 另一种方法自旋锁的注意事项代码其他同步技术 并发与同步 控制流&#xff1a;可理解为任务或进程 中断也可以理解为一个切换到另一个任务&#…

LeetCode 226.翻转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例…

CMake+qt+Visual Studio

#使用qt Creator 创建Cmake 项目,使用Cmake Gui 生成sln 工程&#xff0c;使用Visual Studio 开发 ##使用qt Creator 创建CMake项目 和创建pro工程的步骤一致&#xff0c;只是在选择构建系统的步骤上选择CMake,接下来步骤完全相同 工程新建完成之后&#xff0c;构建cmake 项…

想冲宇宙厂,直接挂了。。。

宇宙厂实际是字节&#xff0c;这个称呼是因为字节跳动主宰了宇宙内一切App&#xff0c;有点家大业大的意思。 今天分享一位字节春招凉经&#xff0c;问了一些数据库和Java八股&#xff0c;没出算法题&#xff0c;直接挂了&#xff0c;竟然最喜欢出算法题的字节&#xff0c;这次…

刷代码随想录有感(49):找树左下角的值

题干&#xff1a; 用层序遍历方便些&#xff0c;因为只需要把res不断替换成每一层第一个节点值即可&#xff0c;代码如下&#xff1a; class Solution { public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*>que;if(root ! NULL)que.push(root);int res …

C++中的数据结构与算法

随处可见的红黑树 一般会用到[key,value]。 例如github中这个例子&#xff0c;第一个是访问网站&#xff0c;第二个是访问次数&#xff0c;但是这个不是静态的&#xff0c;这有个动态排序&#xff0c;并且当我们需要让相应的访问次数加1的时候&#xff0c;我们用红黑树查找的时…

C++每日一练——杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]]提示: 1 <…

Jsoncpp搭建交叉编译环境(移植到arm)

1. 官网下载源码 github地址&#xff1a;GitHub - open-source-parsers/jsoncpp at update 2. 交叉编译环境 当前平台/开发平台-编译环境&#xff1a; [rootlocalroot ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalroot ~]# uname -a Lin…

ELK创建仪表盘

创建仪表盘步骤&#xff1a; 一、保存search二、生成饼图三、创建仪表盘 一、保存search 首先保存一段时间内的search&#xff0c;可以添加想要的字段&#xff0c;并保存这个search方便下次直接打开该search&#xff0c;并方便在可视化和仪表盘中使用该search. 二、生成饼图…

Mac安装telnet

一、安装Homebrew 1、打开官网&#xff1a;Homebrew — The Missing Package Manager for macOS (or Linux) 2、打开终端输入&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 二、安装Telnet bre…