3. HPS启动与引导流程
Agilex 5 的 HPS 子系统上电后并不是直接运行 Linux,而是经历一条严格分层的引导链:从芯片内部固化的 Boot ROM 开始,逐级加载并验证 ATF、U-Boot、Linux 内核、设备树与根文件系统。理解这条链路,是排查“板子起不来”“卡在串口无输出”“内核 panic 找不到 rootfs”等问题的根本前提。本节按启动时序拆解每一级的职责、镜像形态与部署位置。
一、启动链总体结构
Agilex 5 HPS 的引导分为四个阶段:Boot ROM(BL1)→ ATF(BL2/BL31)→ U-Boot(BL33)→ Linux 内核。Boot ROM 是 SoC 出厂固化的只读代码,负责最基础的硬件初始化与首级镜像加载;ATF(ARM Trusted Firmware)建立安全与非安全世界的切换框架;U-Boot 作为通用引导加载器完成外设初始化、镜像加载与内核跳转;Linux 内核接管后挂载根文件系统并启动用户空间。
二、各级镜像的职责与形态
Boot ROM 阶段没有可编程空间,它只做最小初始化:配置启动时钟、采样启动模式引脚、从选定介质读取头部带有 Boot ROM 可识别签名的镜像。Agilex 5 通常把 ATF 与 U-Boot 打包为 u-boot.itb(FIT 镜像),由 Boot ROM 一次性加载到片上 SRAM 或 DDR 起始区域。
ATF 运行在 EL3,负责建立安全世界与非安全世界的边界,并提供 PSCI 电源管理接口。它完成 DDR 控制器初始化后的内存映射交接,然后跳转到 U-Boot。U-Boot 运行在 EL2 或 EL1,负责更丰富的外设驱动:网络、USB、MMC、PCIe 枚举等,最终从存储介质读取内核镜像与设备树。
Linux 内核加载时依赖两个关键输入:内核镜像(Image 或 Image.gz)与设备树二进制(.dtb)。设备树描述 HPS 外设地址、中断号、时钟与引脚复用,是内核识别板级硬件的唯一依据。根文件系统则通过 root= 参数指定,可以是 ext4 分区、initramfs 或 NFS。
三、典型部署流程与命令
以下以 SD 卡启动为例,展示从镜像准备到 U-Boot 环境配置的完整操作。分区布局建议:分区 1 为 FAT32,存放内核与 DTB;分区 2 为 ext4,存放根文件系统。
# 1. 写入 ATF + U-Boot 组合镜像到 SD 卡原始偏移
sudo dd if=u-boot.itb of=/dev/sdX bs=512 seek=2048 conv=fsync
# 2. 拷贝内核与设备树到 FAT 分区
cp Image /media/boot/
cp socfpga_agilex5_board.dtb /media/boot/
# 3. 解压根文件系统到 ext4 分区
sudo tar -xpf rootfs.tar.gz -C /media/rootfs/
# 4. U-Boot 环境变量关键配置
setenv bootargs "console=ttyS0,115200 root=/dev/mmcblk0p2 rw rootwait"
setenv bootcmd "fatload mmc 0:1 ${loadaddr} Image; fatload mmc 0:1 ${fdt_addr} socfpga_agilex5_board.dtb; booti ${loadaddr} - ${fdt_addr}"
saveenv
earlycon 与 loglevel=8,可在内核解压前就通过串口看到早期打印,快速定位卡点是发生在 ATF、U-Boot 还是内核阶段。四、启动阶段与故障对照
| 启动阶段 | 典型输出/现象 | 常见故障点 | 排查手段 |
|---|---|---|---|
| Boot ROM | 串口无任何字符 | 启动模式引脚错误、镜像签名不匹配 | 检查 BOOTSEL、确认 itb 头部 |
| ATF | 打印 BL2/BL31 版本后停住 | DDR 训练失败、内存映射错误 | 核对 DDR 参数、查看 ATF 日志 |
| U-Boot | 出现 U-Boot 提示符但 bootcmd 失败 | 分区号错误、文件不存在 | 手动 fatload / ls mmc 验证 |
| Linux 内核 | Kernel panic: VFS unable to mount root | root= 参数错误、rootfs 未解压 | 检查 bootargs、分区内容 |
五、常见误区与复盘
- 误区一:把 U-Boot 当成第一级引导。实际上 Boot ROM 才是首级,U-Boot 能否运行取决于 ATF 是否正确交接。跳过 ATF 直接调试 U-Boot 往往徒劳。
- 误区二:设备树与内核版本不匹配。DTB 中的 compatible 字符串必须与内核驱动匹配,否则外设静默失效。建议 DTB 与内核同源编译。
- 误区三:根文件系统路径写错。
root=/dev/mmcblk0p2中的设备号会随启动介质变化,SD 与 eMMC 枚举顺序不同,需用rootwait等待设备就绪。 - 复盘要点:每次修改启动参数后,先用
printenv确认变量生效,再重启验证;保留一份可回退的已知良好镜像。