核心概念:ZYNQ 启动的独特性
1.PS 与 PL 的分离与协作:
-
PS: 处理系统,即双核或单核 ARM Cortex-A9/A53 处理器及其外设。它是运行 Linux 的主体。
-
PL: 可编程逻辑,即 FPGA 部分。Linux 系统可能需要使用 PL 实现的定制外设(IP 核)。
-
启动过程不仅要在 PS 上运行软件,还经常需要在启动早期为 PL 配置比特流。
2.BootROM:
-
这是固化在 ZYNQ 芯片内部 ROM 中的一段只读代码,是芯片上电后第一个执行的代码。用户无法修改。
-
它的主要任务是:确定启动源,并加载第一阶段的启动代码 FSBL。
3.多阶段引导:
- 由于 BootROM 能力有限,ZYNQ 采用了一个多阶段的引导过程,每一阶段完成更复杂的任务,并加载下一阶段。
详细启动流程(以 ZYNQ-7000 为例)
整个启动过程涉及多个组件的紧密协作,其核心流程可以概括为以下几个阶段:

下面我们来详细解读图中的每一个阶段。
阶段 0:硬件上电与 BootROM
1.上电复位:给 ZYNQ 芯片供电。
2.BootROM 执行:
-
CPU 0 开始执行 BootROM 代码,CPU 1 处于等待状态。
-
BootROM 初始化最基本的 PS 资源(如时钟、MMU)。
-
根据启动模式引脚(如 MIO[5:0])的设置,确定从哪个设备启动(如 QSPI Flash, SD 卡, NAND, JTAG 等)。
-
BootROM 从启动设备的特定位置(如 SD 卡的第一个FAT分区)搜索一个名为 BOOT.BIN 的文件。
-
它将 BOOT.BIN 文件的前一部分(即 FSBL)加载到芯片内部的内存(OCM)中。
-
校验并跳转到 FSBL 的入口地址,将控制权交给 FSBL。
阶段 1:FSBL - 第一阶段引导加载程序
- FSBL 通常是用户使用 Vitis 或 SDK 创建并编译的。它的主要任务是初始化 PS 的更多外设,并为 PL 配置和加载比特流。
1.PS 初始化:
-
初始化 DDR 内存控制器。这是至关重要的一步,因为后续的大型程序(如 U-Boot、内核)都需要运行在 DDR 中。
-
初始化所需的外设(如 UART 用于串口调试)。
2.PL 配置(可选但常见):
-
如果 BOOT.BIN 中包含了 PL 比特流文件,FSBL 会将其配置到 PL 中。
-
这个过程就是“烧录”FPGA,使PL部分实现用户设计的硬件功能。
-
配置完成后,PS 会释放 PL 的复位,PL 开始工作。
3.加载第二阶段引导加载程序:
-
FSBL 从存储设备(如 SD 卡)中加载 SSBL。在绝大多数情况下,SSBL 就是 U-Boot。
-
将 U-Boot 加载到 DDR 内存中。
-
跳转到 U-Boot 的入口地址,将控制权移交。
阶段 2:U-Boot - 第二阶段引导加载程序
- U-Boot 是一个功能强大的、开源的引导加载程序,它非常灵活,是嵌入式 Linux 系统的标配。
1.U-Boot 自身初始化:
-
初始化更多硬件,如网络、USB 等。
-
设置环境变量(如 bootcmd, bootargs)。这些变量决定了如何启动内核。
2.加载 Linux 启动文件:
-
根据环境变量的设置,U-Boot 从存储设备或网络(TFTP)加载以下文件到 DDR 的特定地址:
-
Linux 内核映像:通常是 zImage 或 uImage。
-
设备树 Blob:.dtb 文件。这个文件描述了系统的硬件信息(CPU、内存、外设、PL 中实现的 IP 核等),是 Linux 内核了解 ZYNQ 具体硬件配置的唯一途径。
-
根文件系统:可能是一个 initramfs(内存在根文件系统),或者是指向存储设备上某个分区(如 EXT4)的指针。
-
3.启动 Linux 内核:
-
U-Boot 使用 bootm 或 booti 命令,将控制权交给 Linux 内核。
-
它会将设备树在内存中的地址传递给内核。
阶段 3:Linux 内核启动
1.内核解压与初始化:
-
内核进行自解压(如果使用 zImage)。
-
初始化 CPU、中断控制器、内存管理等。
-
解析 U-Boot 传递过来的设备树(DTB),根据其中的信息来初始化平台设备。
2.挂载根文件系统:
-
内核根据内核命令行参数来定位和挂载根文件系统。这些参数在 U-Boot 中通过 bootargs 环境变量设置。
-
例如:root=/dev/mmcblk0p2 rw rootwait 表示从 SD 卡的第二个分区挂载根文件系统。
3.启动第一个用户空间进程:
-
内核挂载根文件系统后,会尝试执行第一个用户空间程序,通常是 /sbin/init。
-
在现代系统中,这通常是 systemd 或 busybox init。
阶段 4:用户空间初始化
1.Systemd/Init 启动:
- 系统初始化管理器开始运行,按照其配置启动各项系统服务(如网络、日志、SSH 服务等)。
2.加载 PL 区域的驱动:
-
对于在 PL 中实现的 IP 核(如自定义的 UART、DMA 控制器等),Linux 会在此时加载对应的内核驱动程序。
-
驱动程序通过设备树中描述的硬件信息来找到并初始化这些 IP 核。
3.登录提示:
- 最终,系统启动完成,在串口或显示器上出现登录提示符。
关于 ZYNQ UltraScale+ MPSoC
ZYNQ MPSoC 的启动过程更为复杂,因为它包含了四核 Cortex-A53、双核 Cortex-R5 和一个 Mali GPU。但其核心思想与 ZYNQ-7000 相似:
-
BootROM:同样首先运行。
-
PMU:平台管理单元,负责电源、复位和系统安全。它会加载并运行一段固件(PMU Firmware)。
-
CSU ROM:配置安全单元,负责系统安全启动。它加载第一阶段的引导程序(FSBL 或其替代品)。
-
FSBL / U-Boot:流程与 ZYNQ-7000 类似,但可能需要考虑 A53 集群与 R5 集群之间的协作。
-
后续的 Linux 内核、设备树、根文件系统 阶段基本一致。
总结:关键文件与工具

BOOT.BIN 是 ZYNQ 启动的核心,它是由 BootROM 直接加载的容器文件,内部封装了 FSBL、比特流和 U-Boot 等组件。理解并正确生成 BOOT.BIN 是成功启动 ZYNQ Linux 系统的关键第一步。

4868

被折叠的 条评论
为什么被折叠?



