
本文系统梳理嵌入式系统从上电复位到用户应用程序运行的完整启动链路涵盖硬件复位、BootROM、Bootloader、内核、根文件系统与 init 进程等关键环节并对比 ARM 与 x86 的典型差异及常见调试方法。一、为什么需要理解启动流程嵌入式设备没有 PC 那样明显的开机画面和操作系统安装向导但每一次上电背后都有一套严格有序的启动链条。理解这套流程有助于定位启动失败卡在哪个阶段、如何抓日志、如何区分硬件与软件问题优化启动时间裁剪 Bootloader、内核、用户态服务满足车规、工控等对冷启动时延的要求做安全启动Secure Boot在每一级校验下一级镜像的签名与完整性做 OTA 与现场维护明确哪些分区可写、升级应更新哪些镜像可以把启动过程想象成多级接力每一棒只负责把控制权交给下一棒并准备好下一棒运行所需的最小环境。二、启动流程总览典型嵌入式 Linux 系统的启动顺序如下上电 / 复位 ↓ SoC 硬件初始化时钟、复位向量 ↓ BootROM芯片固化代码不可修改 ↓ 第一级 BootloaderSPL / FSBL / MaskROM 加载的外部代码 ↓ 第二级 BootloaderU-Boot、Barebox、ARM Trusted Firmware 等 ↓ 加载设备树DTB 内核镜像zImage/Image/uImage ↓ Linux 内核启动架构相关初始化 → 驱动子系统 → 挂载根文件系统 ↓ 用户空间 initsystemd / busybox init / 自定义脚本 ↓ 业务应用程序裸机系统无操作系统通常在上电后由 BootROM 加载一段 Flash 中的程序直接运行应用或 RTOS链路更短但前几级硬件初始化逻辑类似。三、上电与硬件复位3.1 上电时发生了什么设备接通电源后电源管理芯片PMIC按序给各电源域供电。SoC 内部的Power-On ResetPOR电路在电压稳定后产生复位信号CPU 及主要外设进入已知初始状态。3.2 复位向量Reset VectorCPU 复位后程序计数器PC被硬件强制设为复位向量地址。该地址由芯片手册规定例如架构/平台典型复位向量行为ARM Cortex-A通常从0xFFFF0000高向量或0x00000000取指具体由VBAR/启动模式引脚决定ARM Cortex-M向量表第 0 项为初始栈指针第 1 项为 Reset_Handler 地址RISC-Vmtvec指向的入口或由 BootROM 固定映射复位后最先执行的一定是芯片厂商烧录在片内或外部固定存储器中的代码——即 BootROM 或其加载的第一段代码。3.3 最小硬件环境在跳转到可执行代码之前硬件通常会自动或很快完成使能基础时钟有时 BootROM 内再配置 PLL初始化用于启动的存储接口SPI NOR、eMMC、SD 等配置启动引脚Boot Mode Pins决定从哪类介质启动Boot Mode是现场排障的高频检查点同一板卡接不同启动介质、拨码不同会走完全不同的启动路径。四、BootROM第一棒芯片自带4.1 BootROM 的职责BootROM 是固化在 SoC 内部的只读程序主要完成根据 Boot Mode 选择启动设备从启动设备读取一小段代码到片上 SRAM内部 RAM容量通常仅几十 KB几百 KB校验该代码部分芯片支持简单 CRC安全芯片会做签名验证跳转到 SRAM 中执行——进入第一级 BootloaderSPL4.2 为什么需要 SPLSecondary Program Loader片上 SRAM 很小放不下完整的 U-BootFlash 中的完整 Bootloader 也可能需要先初始化 DDR 才能运行。因此常见做法是SPL体积极小只做 DDR 初始化、时钟树配置、加载下一阶段 Bootloader完整 Bootloader在 DDR 就绪后运行功能完整网络、USB、文件系统、内核加载典型命名SPLU-Boot 体系中的第一级加载器FSBLFirst Stage Boot LoaderXilinx Zynq 等 FPGA SoC 术语TF-A BL2ARM Trusted Firmware 安全启动链中的一级4.3 无外部启动介质时的行为部分 MCU 支持从 UART/USB 下载ISP/DFUBootROM 等待主机下发代码常用于产线烧录与开发调试。五、Bootloader连接硬件与内核的桥梁第二级 Bootloader 在嵌入式 Linux 中最常见的是U-Boot此外还有 Barebox、RedBoot较老等。Bootloader 的核心任务可以概括为四句初始化外设 → 提供命令行/自动启动脚本 → 加载内核与 DTB → 跳转内核并传递参数5.1 典型初始化内容DDR/SDRAM 控制器若 SPL 未做完存储设备eMMC、NAND、NOR、SPI Flash网络以太网 PHY、MAC便于 TFTP 启动与调试串口UART打印U-Boot提示符输出启动日志环境变量区保存在 Flash 专用分区存bootcmd、bootargs等5.2 环境变量与启动脚本U-Boot 中两个关键变量bootargs传给 Linux 内核的启动参数字符串例如consolettyS0,115200 root/dev/mmcblk0p2 rootfstypeext4 rwbootcmd自动启动时执行的命令序列例如从 eMMC 分区读取内核fatload mmc 0:1 0x82000000 zImage; fatload mmc 0:1 0x88000000 dtb; bootz 0x82000000 - 0x88000000开发阶段常用手动命令验证各步骤确认后再写入bootcmd固化。5.3 向内核传递信息的方式方式说明ATAGs较老的 ARM32 方式通过 r2 寄存器传递链表结构设备树DTB现代 ARM/RISC-V 主流硬件描述与内核分离ACPI部分 ARM 服务器、x86 使用UEFI部分高端嵌入式/ARM Server 通过 UEFI 固件启动跳转内核时Bootloader 需按约定设置寄存器如 ARM32 的 r00, r1机器类型或 0, r2DTB 地址并跳转到内核入口。六、设备树Device Tree描述硬件的清单6.1 为什么需要设备树传统做法在内核源码中为每块板子写machine descriptor和大量板级文件维护成本高。设备树把硬件拓扑与配置抽成.dts源文件编译为二进制.dtb由 Bootloader 随内核一起加载。6.2 设备树里有什么CPU 核数、频率、enable-method内存memory节点基址与大小外设寄存器基址、中断号、时钟源、GPIO 引脚总线拓扑I2C/SPI 下挂的设备内核驱动通过compatible字符串匹配驱动例如uart0: serial02020000 { compatible vendor,uart; reg 0x02020000 0x1000; interrupts GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH; clocks clk_uart; status okay; };6.3 与启动的关系若 DTB 中内存大小、串口节点错误常见现象是内核能打印早期 log随后 panic 或串口无输出。排障时要核对 Bootloader 加载的 DTB 是否与当前板卡一致。七、Linux 内核启动阶段内核镜像被 Bootloader 加载到内存并跳转后执行流程大致如下不同架构细节不同逻辑相通。7.1 架构相关早期代码设置初始页表、开启 MMU若尚未开启识别 CPU 类型、缓存行大小解析设备树early_init_dt_scan获取内存布局、cmdline此阶段输出常出现在串口关键字如Booting Linux on physical CPU、内存 bank 信息。7.2start_kernel与驱动子系统进入 C 语言主初始化路径start_kernel()后依次完成调度器、定时器、中断子系统内存管理buddy、slab平台设备与总线驱动注册基于 DTB块设备、VFS、挂载rootfs7.3 根文件系统的挂载root启动参数指定根设备常见形式参数示例含义root/dev/mmcblk0p2eMMC 第 2 分区root/dev/nfs nfsroot192.168.1.10:/nfsNFS 网络根文件系统开发常用root/dev/ram0内存盘常与 initrd/initramfs 配合initramfs打包在内核镜像内或单独加载的临时根文件系统内含必要驱动与挂载脚本用于找到真实根分区LVM、加密盘、USB 硬盘等场景。挂载成功后内核打印VFS: Mounted root (ext4 filesystem) on device 179:2. Run /sbin/init as init process7.4 内核启动时间线概念图汇编入口 → 早期汇编/C → start_kernel → rest_init → kernel_init 线程 → 尝试执行用户空间 /sbin/init或 init 指定八、用户空间init 与业务进程8.1 init 进程的职责内核启动的第一个用户态进程 PID1Traditionally/sbin/init。职责包括挂载/proc、/sys、/dev等虚拟文件系统按运行级别或 target 启动系统服务回收僵尸进程拉起 getty 登录或直接进入应用8.2 常见 init 实现实现特点BusyBox init体积小脚本/etc/inittab配置适合资源受限设备systemd主流桌面/服务器与部分嵌入式发行版依赖并行、单元文件自定义脚本/etc/init.d/rcS直接启动单一应用工控、消费电子常见嵌入式产品为缩短启动时间常裁剪 systemd、减少不必要服务甚至 init 直接exec业务程序。8.3 应用程序启动业务层可能是Qt / GTK 图形界面后台守护进程 Web 配置ROS 节点、流媒体服务等从系统角度看它们只是 init 拉起的普通进程启动优化往往要分析整条依赖链网络就绪、数据库挂载、许可证校验等。九、不同启动介质与存储布局9.1 常见介质对比介质特点典型用途SPI NOR Flash随机读快、可 XIP容量较小Bootloader、内核、小 rootfsNAND / eMMC容量大、成本低大 rootfs、数据分区、OTASD 卡开发方便原型验证网络TFTP/NFS无需本地烧录内核与 rootfs 开发调试9.2 典型 Flash 分区示例------------------ | SPL / BootROM 加载区 | ------------------ | U-Boot 完整镜像 | ------------------ | 环境变量 (env) | ------------------ | 内核 (zImage) | ------------------ | 设备树 (dtb) | ------------------ | 根文件系统 (squashfs/ext4) | ------------------ | 用户数据 / OTA 备份 | ------------------分区表可能来自硬编码地址、GPT/MBR、U-Bootmtdparts或厂商私有方案。升级时务必对照分区文档避免擦除 Bootloader。十、安全启动Secure Boot简述安全启动在每一级只加载经过厂商密钥签名验证的下一级镜像BootROM 校验 SPL 签名 → SPL 校验 U-Boot/TF-A 签名 → Bootloader 校验内核与 dtb → 可选内核校验 dm-verity / 模块签名相关技术ARM Trusted Firmware-ATF-AEL3 固件、PSCI、安全世界切换OP-TEE安全 OS密钥与生物特征等敏感逻辑dm-verity根文件系统块级完整性防篡改开发与安全启动冲突的常见点未签名内核无法启动、JTAG 被熔断。需在方案阶段规划密钥与签名流水线。十一、ARM 与 x86 嵌入式启动差异简表项目ARM 嵌入式x86 嵌入式如 Atom第一级代码BootROM SPLUEFI/BIOS 固件BootloaderU-Boot 为主GRUB UEFI硬件描述设备树为主ACPI 为主典型产品路由器、摄像头、工控网关、边缘服务器x86 路线更接近 PCUEFI 固件 → EFI 分区上的 GRUB → Linux但内核 → init → 应用的后半段与 ARM 类似。十二、启动失败排障思路按阶段分层排查先看串口最后一行 log 卡在哪里无任何打印电源、Boot Mode、串口线/波特率、UART 引脚是否被 Bootloader 初始化仅有 BootROM/SPL 信息DDR 训练失败、Flash 读失败、镜像损坏U-Boot 停住bootcmd错误、分区无内核、环境变量损坏可printenv/ 恢复默认 env内核 panicbootargs根设备错误、缺少驱动、DTB 不匹配内核挂起无 initrootfs 损坏、init 不存在或不可执行init 起来但应用无响应用户态脚本、依赖服务、许可证或配置问题常用工具串口终端minicom、picocomJTAG/SWDOpenOCD查看 PC 指针与寄存器U-Bootmd、mmc、fatls、tftp等命令内核earlyprintk、initcall_debug启动参数十三、启动时间优化产品向层级常见手段Bootloader跳过网络/USB 初始化、精简bootdelay、并行加载内核CONFIG_EMBEDDED、裁剪驱动、禁用不必要子系统、压缩镜像rootfsinitramfs 瘦身、squashfs 只读根、延迟挂载用户态减少 systemd 单元、应用懒加载、并行初始化无依赖模块测量方式GPIO 翻转打点、printk时间戳、systemd-analyze若适用、示波器量关键电源轨上电时序。十四、小结嵌入式系统启动是一条从硬件复位到软件分层交付的严格流水线BootROM解决从哪启动、加载谁的问题SPL Bootloader解决DDR 与外设就绪、把内核搬进内存的问题内核解决驱动硬件、挂载根文件系统的问题init解决用户空间环境与守护进程的问题应用程序才实现产品价值掌握每一级的输入输出谁加载谁、参数如何传递、日志长什么样就能把板子不亮、“卡在 Starting kernel”、根文件系统挂载失败等问题快速定位到具体层级而不是盲目换镜像或重烧整片 Flash。参考资料Linux 内核文档Documentation/admin-guide/boot.rst、Documentation/devicetree/U-Boot 官方文档https://docs.u-boot.org/ARM Architecture Reference Manual复位、异常向量、TrustZone各 SoC 厂商 TRMTechnical Reference ManualBoot 章节本文为技术总结具体芯片请以官方数据手册与 BSP 为准。