ZYNQ的 Linux 启动过程

核心概念: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 系统的关键第一步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s0907136

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值