运行Yocto镜像的树莓派CM4搭载u-boot的启动流程相关问题咨询
问题1解答
首先纠正一个认知偏差:boot.scr的执行时机是在U-Boot启动之后,而非之前,它是U-Boot默认会自动从boot分区根目录读取执行的脚本,不需要U-Boot之外的组件处理。
至于config.txt没有指定kernel参数时start.elf仍能加载U-Boot的原因:meta-raspberrypi的U-Boot集成配方启用RPI_USE_U_BOOT配置后,会自动将编译生成的u-boot.bin重命名为start.elf默认搜索的内核文件名,对于32位CM4来说,start.elf默认最高优先级的32位内核文件名就是kernel7l.img,所以start.elf按默认规则就能直接加载U-Boot,不需要额外在config.txt里配置kernel参数。
问题2解答
uImage完全不是u-boot.bin的别名。uImage是专门给U-Boot引导用的Linux内核镜像格式:它是在原生Linux内核镜像(如zImage)头部增加了64字节的U-Boot专属头,记录了镜像类型、加载地址、校验和等信息,方便U-Boot校验和引导。而u-boot.bin是U-Boot本身的 bootloader 二进制文件,两者功能和定位完全不同。
问题3解答
这个集成方案下U-Boot不需要额外加载你认知里的kernel7l.img:boot.scr里指定加载的uImage就是CM4对应的实际Linux内核,只是封装格式不同而已。你之前接触的kernel7l.img是适配start.elf直接引导的原生内核格式,uImage是适配U-Boot引导的封装格式,两者对应的内核源码和编译配置是一致的,只是打包格式有区别。
问题4解答
树莓派常见的U-Boot集成方式还有3种:
- 常规发行版常用的方案:在config.txt中显式配置
kernel=u-boot.bin,U-Boot启动后读取extlinux.conf配置文件加载内核和设备树,是最通用的方案。 - 物联网固件常用方案:将U-Boot、内核、设备树打包进统一的boot.img分区,符合OTA升级的校验要求。
- 外置介质启动方案:将U-Boot直接烧写到SPI Flash中,跳过SD卡boot分区的加载步骤,适合从USB、NVMe等非SD卡介质启动的场景。
不同集成方案的具体配置规则可以参考meta-raspberrypi层的官方说明文档,里面对所有U-Boot相关的配置项和集成逻辑都有明确记录。
内容的提问来源于stack exchange,提问作者Anthony Arrascue

