尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

meta-raspberrypi启动链解密:armstubs与U-Boot双引导方案如何优雅实现

meta-raspberrypi启动链解密:armstubs与U-Boot双引导方案如何优雅实现 meta-raspberrypi启动链解密armstubs与U-Boot双引导方案如何优雅实现【免费下载链接】meta-raspberrypiYocto/OE BSP layer for the Raspberry Pi boards项目地址: https://gitcode.com/gh_mirrors/me/meta-raspberrypimeta-raspberrypi 是一个专为 Raspberry Pi 全系开发板打造的 Yocto Project BSP 层Board Support Package。本文将带你完整解读它的启动链Boot Chain从 VideoCore 固件到 Linux 内核armstubs引导桩与 U-Boot 两种方案如何分工协作以及一张 SD 卡镜像是如何被自动拼装出来的。无论你是 Yocto 新手还是嵌入式爱好者都能从中理清树莓派 Linux 镜像启动的每一环。树莓派的启动链长什么样树莓派没有传统意义上的 BIOS它的启动由片上的VideoCore 固件闭源Broadcom 授权主导。一条完整的启动链大致是bootcode.binSoC 内置 ROM 拉起的第一段代码start4fw.elfGPU 固件负责解析config.txt、初始化硬件armstubARM 引导桩被固件放进内存、交由 ARM CPU 执行的第一段桥代码内核或 U-Boot最终跳转到 Linux 内核或先交给 U-Boot 引导加载器Linux 内核 设备树完成系统启动meta-raspberrypi 层的价值就在于把第 2、3 步所需的固件与引导桩文件全部纳入 Yocto 构建体系并让你只需一个变量就能在第 4 步中选择 armstubs 直启或 U-Boot 引导两条路线。armstub固件与内核之间的第一座桥armstub 的官方描述只有一句话由 GPU 放入内存、用于开始运行引导加载器的跳板代码。见 armstubs.bb它本质是一段极小的汇编程序编译自上游固件树的armstub.S负责把内核镜像搬到正确地址并跳转执行每个机型通过ARMSTUB变量指定自己需要的那一款引导桩例如Raspberry Pi 1 / Zero / CM → raspberrypi.conf 中的armstub.binRaspberry Pi 2 / 3 / 432 位→ raspberrypi4.conf 中的armstub7.bin64 位模式 → raspberrypi4-64.conf 中的armstub8-gic.bin构建时 armstubs.bb 会根据当前机型调用 make 生成对应的.bin并部署到镜像 deploy 目录 关键认知即使你选择 U-Boot 方案armstub 依然必不可少——U-Boot 本身也是被 armstub 加载进内存的。一行变量切换 U-Boot 方案优雅在哪里在local.conf中写入一行RPI_USE_U_BOOT 1整个构建体系就会自动切换到 U-Boot 引导路径无需手工改任何配方。这一切换由 rpi-base.inc 中的条件表达式驱动它会自动完成三件事内核镜像格式自适应不启用 U-Boot 时使用zImagePi 5 用Image由固件直接加载启用 U-Boot 后自动换成uImage配合bootm命令加载启动命令自适应32 位板用bootm而 raspberrypi5.conf 中 Pi 5 使用Imagebooti组合arm64 不支持 zImage启动脚本自动生成rpi-u-boot-scr.bb 基于 boot.cmd.in 模板用mkimage生成boot.scr——它会自动读取设备树中的bootargs、从 SD 卡加载内核、并在首次启动时保存环境变量此外u-boot_%.bbappend 还为 U-Boot 注入了fw_env.config环境变量存储位置配置并为 Pi 4 追加了maxsize.cfg以匹配其 DDR 布局。⚠️ 小提示在 Zero W、Pi 3、Pi 4 上使用 U-Boot 需要config.txt中保持enable_uart1rpi-config_git.bb 会在构建期自动校验这一约束。SD 卡镜像两条启动线如何被自动拼装最终镜像由 sdcard_image-rpi.bbclass 统一打包磁盘布局为4 MiB 对齐的保留区 48 MiB 的 VFAT 引导分区 ext 根文件系统。引导分区的内容按方案自动裁剪文件armstubs 直启U-Boot 引导固件文件bootfiles/*.elf/.bin✅✅armstub*.bin当前机型✅✅设备树 .dtb / .dtbo 覆盖层✅✅内核镜像zImage 或 Image✅✅u-boot.bin改名为 kernel8.img 等❌✅boot.scr 启动脚本❌✅其中u-boot.bin 改名为内核文件名这步在 sdcard_image-rpi.bbclass 中完成——因为 VideoCore 固件只会去加载固定名字的内核文件U-Boot 便借此借位进入启动链。分区定义也可通过 sdimage-raspberrypi.wks 以 WIC 方式生成。该选哪条启动路线追求简单快速、无交互保持默认armstubs 直启内核链路最短、启动最快需要引导菜单、环境变量、extlinux 多系统开启RPI_USE_U_BOOT 1获得完整的引导加载器能力Pi 5arm64两种方案下内核均为Image格式由 raspberrypi5.conf 指定kernel_2712.img加载名两条路线共享同一套固件与 armstub 基础设施切换成本仅一行变量——这正是 meta-raspberrypi 在 Yocto 体系中实现双引导方案的优雅之处差异被收敛在机器配置与条件变量里构建者无需理解底层细节即可为任意板型产出可启动的 SD 卡镜像。【免费下载链接】meta-raspberrypiYocto/OE BSP layer for the Raspberry Pi boards项目地址: https://gitcode.com/gh_mirrors/me/meta-raspberrypi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表