前言
前两天刷B站的时候发现有UP在控诉CSDN的逆天操作,特别是将非VIP文章转为VIP文章这点确实很恶心,我之前也在CSDN发过几篇技术类的随笔,有一天也发现莫名奇妙就被设为VIP文章了,所以不打算在CSDN上写了,选择来博客园分享一下技术学习中的感想和心得。
这篇笔记是我之前很早就想做的有关XILINX官方文档的读书笔记,因为感觉虽然从技术上学了不少东西,但是理论却不是很牢固,于是就想找一篇官方文档来读一读顺便做一点记录,于是就找到了ug1137 MPSoC软件开发者指南这篇文档,其实和这篇文档很类似的还有ug1228-ultrafast-embedded-design-methodology-guide这篇文档,但是该文档自从2017年发布后就没再更新,所以还是选择了更新的ug1137来读一读。相关文档链接如下:https://docs.amd.com/r/en-US/ug1137-zynq-ultrascale-mpsoc-swdev。
下面我们就逐个章节的读完这篇文档,当然最后要提一句,由于是做读书笔记而不是内容翻译,每个章节里只会提到我觉得比较重要的内容和概念,有时也会大量贴直接机器翻译的原文,且由于我比较菜,对这些内容的理解可能会出现纰漏,如果发现问题也欢迎指正。
Chapter 1: About This Guide 指南介绍
1.1 Introduction介绍
没什么内容,主要有讲了下MPSOC内有些什么硬件资源
1.2 Intended Audience and Scope of this Document 本文本的适用人群
这一节说了下文本的目标是让软件开发者和系统架构师熟悉下面的几点
-
AMD的软件工具
-
可用于编程的选项
-
AMD的软件组件包括设备驱动,中间件堆栈(不太懂这个),架构和应用实例
-
平台管理单元硬件PMU,Trusted Firmware-A (TF-A),OpenAMP,PetaLinux tools,Xen Hypervisor,以及其他的MPSOC开发工具
1.3 Prerequisites 预备条件
就是你要能够看懂该文章需要具备的知识,最基础的是以下几点
-
嵌入式软件开发的经验
-
熟悉Armv7和Armv8架构
-
熟悉AMD的开发工具例如VIVADO,VITIS以及编译器,调试器和操作系统的相关知识
(PS:其实我觉得他这里的熟悉可能不是我理解的熟悉)
最后说了一下各个章节的作用,C代表Chapter
-
C1:About This Guide 文档用途介绍。
-
C2:Programming View of Zynq UltraScale+ MPSoCs MPSOC编程视角,简短的讲了MPSOC的硬件架构,并建议软件开发人员通读本章并了解构建和调试软件应用程序所涉及的过程。
-
C3:Development Tools 提供关于AMD软件开发工具的简要说明。本章帮助了解软件开发工具中的所有可用功能。建议软件开发人员仔细阅读本章,并了解构建和调试软件应用程序所涉及的流程。
-
C4:Software Stack:软件栈,对各种软件栈进行描述,例如裸机开发、基于RTOS以及AMD提供的完整Linux栈(petalinux),用于开发基于MPSoC器件的系统。
-
C5:Software Development Flow 软件开发流:过一遍软件开发过程,还简要描述了Linux和裸机中支持的API和驱动程序。
-
C6:Software Design Paradigms 软件设计范式,了解在异构系统上开发软件的不同方法。阅读本章后将更好地了解不同处理器模式下的编程,例如对称多处理(SMP)、非对称多处理(AMP)、虚拟化以及结合了SMP和AMP的混合模式。
-
C7:System Boot and Configuration系统启动和配置,描述在安全和非安全模式下使用不同引导设备的引导过程
-
C8:Security Features 安全特性,描述MPSoC能用来增强应用程序启动和运行时的安全性的特性。
-
C9:Platform Management 平台管理器,介绍可用于管理功耗的功能,以及如何使用软件控制各种电源模式
-
C10:Platform Management Unit 平台管理单元硬件:描述为MPSoC设备开发的PMU硬件的特性和功能。
-
C11:Power Management Framework 电源管理框架:描述AMD电源管理框架(PMF)的功能,该框架支持通过平台管理单元(PMU)进行灵活的电源管理控制。
-
C12:Reset 复位,解释系统级和模块级的复位
-
C13:High-Speed Bus Interfaces 高速总线接口,解释高速接口协议的配置流程
-
C14:Clock and Frequency Management 时钟和频率管理:简要解释MPSoCs中外设的时钟和频率管理。
-
C15:Target Development Platforms 介绍ZMPSoC设备可用的不同开发平台,如快速仿真器(QEMU)和MPSoC开发板和套件。
-
C16:Boot Image Creation: 创建引导镜像 描述用于为MPSoCs创建可引导镜像的独立工具Bootgen,其包含在Vitis软件平台中。
-
附录A:Libraries:描述可用的库和板级支持包(bsp)以帮助您开发软件平台。
-
附录B:Additional Resources and Legal Notices
第一章的章节描述部分我重点的翻译了一下,因为要搞懂每个章节是干什么的才好继续去阅读各个章节,接下来的内容我可能就会讲点快一点,不进行大批量的翻译了。
Chapter2:Programming View of Zynq UltraScale+ MPSoCs MPSOC编程视角
2.1 Hardware Architecture Overview硬件架构概述
这一节就讲了MPSOC的主要器件,都在下面这一张图中包含了,并且提到要查看图表中器件更详细的内容,可以查看ug1085 Zynq UltraScale+ Device Technical Reference Manual.

2.2 Boot Process引导过程
这一节主要说了MPSOC外部boot的几种方式,有Quad SPI flash memory (QSPI24, QSPI32),eMMC18,NAND,Secure Digital Interface Memory (SD0, SD1),JTAG ,USB,还介绍了以下这些启动方式的特性。这里还额外提到这样一句话:
BootROM不直接支持从ATA、以太网或PC Express(EDI)引导。引导安全性不依赖于TrustZone(TZ),并且在很大程度上与TrustZone(TZ)垂直。BootROM(运行在PMU上)执行安全资源管理(例如密钥管理)并建立信任根。它对FSBL进行身份验证、锁定引导安全资源并将信任链控制转移到FSBL(无论是在APL还是RPU上)。
我结合deepseek理解了一下,就是引导只能从内部PMU的bootROM开始,在建立信任根后才会使用FSBL进行下面的引导。不过我完全不懂安全启动到底是什么,你就当我是瞎说。
2.3 Virtualization虚拟化
这一节讲了下虚拟化的作用和概念,大概翻译如下
虚拟化允许多个软件栈在同一处理器上同时运行,从而提高了MPSoC的生产力。虚拟化的作用因系统而异。对于某些设计师来说,虚拟化允许处理器始终处于满载状态,从而节省功耗并最大限度地提高性能。对于其他系统,虚拟化提供了对各种软件堆栈进行分区以实现隔离或冗余的方法。
2.4 System Level Reset Requirements系统级复位要求
这一节描述了系统或子系统级的复位要求和复位作用,主要有External POR(Power-on-Reset),Internal POR,System Reset,PS Only Reset,FPD Reset(FPD,Full-Power_domain),RPU Reset。这些复位的触发和触发情景,以及复位的作用都不太一样,具体可以参看下面的表格:

2.5 Security信息安全性
这一节讲了MPSOC提供的器件安全特性,安全特性主要是起到下面的三个作用:
-
加密和验证boot image。
-
Hardened crypto accelerators for use by the user application.(没看懂)
-
安全的存储密钥。
Configuration Security Unit (CSU)可配置安全单元
这一部分讲了一下CSU的构成以及各部分的作用,作用如下:
-
安全启动
-
篡改监测与响应
-
安全密钥存储和管理
-
加密硬件加速器
原文对其结构的描述如下:
- CSU由两个主要模块组成,如下图所示。左侧是安全处理器块,其中包含一个用于控制引导操作的三重冗余处理器,还包含一个相关的ROM、一个小型专用RAM以及支持所有安全操作所需的必要控制/状态寄存器。右侧的块是加密接口块(CIB),包含AES-GCM、DMA、SHA、RSA和PCAP接口。
- 在引导完成后,CSU提供篡改监控。这些加密接口在运行时也同样可用。
总的来说,CSU负责安全启动以及在启动时进行各种的安全校验,同时也提供硬件上的校验或者加解密器供调用,这里还有讲到构成CSU的各个部件的作用,但是我从来没使用过加密的相关器件所以就不看了,后面的章节可能会详细说
System-Level Protections系统级保护
这部分由于我没看懂就到处搜索了一下,可能理解不一定对,原文翻译以及注释如下:
Zynq UltraScale+ MPSoC Linux软件栈依赖于Trusted Firmware-A(TF-A)。通过配置AMPU和APPU以提供系统级运行时安全性,可以进一步增强保护。
- 防止有缺陷或恶意软件(错误软件)损坏系统内存或导致系统故障。
- 防止不正确的编程或恶意设备(错误的硬件)损坏系统内存或导致系统故障。
- 存储器(DDR,OCM)和外围设备(外围控制,SL CR)受到保护,免受错误软件或硬件的非法访问,以保护系统。
Trusted Firmware-A是ARM的一套软件防御体系,具体内容由于我不懂ARM所以不太看得懂,这里就不提了。
AMD内存保护单元(AMPU)强制对FPD从器件和内存进行内存分区和TrustZone (TZ)保护。AMPU可以配置为分离单一主机或给定的一系列主机的开发者定义的地址范围集(大致意思应该是是对不同的主机分离出不同供其使用的内存)。
AMPU主要用来管理对内存的访问是否符合规则
AMD外围设备保护单元(APPU)提供LPD外设隔离和处理器间中断(IPI)保护。APPU可以配置为允许一个或多个主机访问LPD外设。
APPU主要用来管理对外设的访问是否符合规则
2.6 Safety and Reliability安全性和可靠性
这部分主要讲MPSOC为了增强应用程序的可靠性和安全性提供了一些关键特性:
- 内存与缓存错误检测和纠正
指APU和RPU具有各自不同的内存和缓存保护特性,例如APU的SCU-L2 cache protection和CPU cache protection,RPU的Lock-step operation特性
- RPU的安全特性
这里着重讲了RPU的Lock-Step Operation特性并附了一张结构图:
- Cortex-R5F处理器支持锁步操作模式,该模式将两个RPU中央处理器核心作为称为安全模式的冗余中央处理器配置进行操作.
- Cortex-R5F处理器设置为以锁步配置运行,仅暴露一个中央处理器接口。由于Cortex-R5F处理器仅支持静态拆分和锁定配置,因此仅在处理器组处于Poweronreset(POR)状态时才允许在这些模式之间切换。输入信号SLCLAMP和SLSPLIT控制处理器组的模式。
- 这些信号控制锁步配置中的多路传输和钳位逻辑。当Cortex-R5F处理器处于锁步模式时,复位处理程序中必须有代码来管理GIC内的中断分发器仅将中断分发到CPU0。
这里我搜索了一下什么是Lock-step operation,我仔细看了一下其实原理还挺简单,就是两个CPU核执行完全一样的操作,如果发现最终结果不一致,就说明出现了错误,文档实际上就描述了配置为Lock-step模式后的管理以及中断控制器需要如何配置
- 系统范围的安全特性
指的是MPSOC主动预防错误发生的操作即error-free,主要是使用PMU和PMU Triple-Redundancy(PMU三重冗余)和中断实现的。
- PMU:加载RAM或ROM中的执行代码,实施电源安全例程以防止PS电压轨被篡改,执行逻辑内置自测试(LBIST,Logic Built-In Self-Test),并响应用户驱动的电源管理步骤,还包含了三个特殊寄存器来控制通常对设备的操作和安全非常关键的功能。
- PMU三重冗余:用三个MicroBlaze处理器来处理高等级的系统安全问题和单粒子翻转(SEU)问题。PMU控制整个系统内资源的通电、重置和监控的任务,并还承担下面这些任务:
- 启动期间初始化系统
- 管理不同区域的电源门控
- 将电源电压设置传达给外部电源控制设备
- 管理睡眠状态,包括深度睡眠模式和唤醒功能的处理
- 中断(我理解的是使用中断也是使得系统能够减少错误发生的一种手段,所以在这里提到了中断):APU和RPU有各自的中断控制器GIC-400和PL-390,包含GICv1和GICv2控制器,并且MPSOC还内嵌了处理器间中断模块,用于异构处理器通信。
2.7 Memory Overview for APU and RPU Executables APU和RPU可执行内存
可执行内存指的是应用程序(可执行文件)能在MPSoC的该内存区域内运行并配置,也就是CPU在运行程序时能够使用的内存区域,对于APU和工作在不同模式下的RPU,其能进行工作的内存区域是不同的,如下表所示:

这里额外提到了两个NOTE,第一个NOTE大概讲的是RPU处于不同模式下内存映射的地址不一样,TCM是紧密耦合内存,我这里直接贴原文了,NOTE1:
- In RPU lock-step mode , R5_0_ATCM_MEM_0 and R5_0_BTCM_MEM_0 memory address are mapped to R5_0_ATCM_LSTEP and R5_0_BTCM_LSTEP memory ranges respectively in the system address map.
- In RPU split mode, R5_x_ATCM_MEM_0, and R5_x_BTCM_MEM_0 memory address are mapped to R5_x_ATCM_SPLIT and R5_x_BTCM_SPLIT memory ranges respectively in the system address map.
- QSPI memory is accessible when QSPI controller is in linear mode.
第二个NOTE比较关键,讲的是Bootgen在生成BootROM时会检查FSBL的代码是否被编译后放在OCM的0xFFFC0000这个位置,如果不是的话,就会拒绝生成BootROM,造成这一现象的根本原因我还没查清楚,到第7章讲BOOT时应该就明了了,NOTE2:
BootROM always copies First Stage Boot Loader (FSBL) from 0xFFFC0000 and it is not configurable. If FSBL is compiled for a different load address, Bootgen can refuse it as CSU BootROM (CBR) does not parse partition headers in the boot image but merely copies the FSBL code at a fixed OCM memory location (0xfffc0000)
结语
在写这两章之前我还信心满满,以为不到200页的技术文档应该会很快看完,结果刚写完前两章就觉得内容多的不行,而且很多内容也没太看懂,感觉还得更加把劲,接下来我准备一章一章的更新内容,我们下一章再见。

