本文约2900字,上一篇《嵌入式软件工程师面试准备:SDK与文件系统移植方向》整理了嵌入式软件SDK与文件系统移植方向的面试题,本文继续来分析面试高频问到的Linux启动流程问题。
关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。
嵌入式 Linux 是典型的多级链式启动,每一级都只为下一级做铺垫、逐级解锁硬件能力,最终完成系统启动。
本文一起来学习Linux标准启动流程:
ROM Boot → BootROM → SPL → UBoot → Kernel → RootFS,讲透每一层的运行位置、核心职责、技术局限与衔接逻辑,适配 ARM/ARM64 嵌入式开发板、智能设备通用场景。
先记住核心逻辑:前一级容量小、功能极简,只负责初始化基础环境、加载下一级程序,逐级扩容硬件能力,最终拉起完整 Linux 系统。
💡 全文共 8 个章节,阅读约需 5 分钟,建议先收藏再细读。
SoC 芯片硬件固化的启动逻辑,无代码、不可修改,是上电后 CPU 执行的第一优先级逻辑。
系统上电、硬件复位后,CPU 寄存器被初始化,PC 指针强制指向芯片固定启动地址,完成最基础的硬件自检与启动介质选择:
完全硬件固化、用户无法修改、无任何外设初始化能力,仅做“启动路由选择”,是整个启动流程的入口开关。
SoC 片内只读 ROM(出厂固化代码),掉电不丢失、不可烧录修改,行业内也称 BL0(Boot Level 0)。
承接 ROM Boot 的启动源判定结果,完成极简硬件初始化,并加载下一级 SPL 程序:
片内 ROM 空间极小,代码功能极度精简,无法初始化 DDR 内存、网卡、显示等复杂外设,必须依赖 SPL 完成后续硬件初始化。
加载在芯片片内 SRAM 运行,SRAM 无需初始化即可上电运行、速度快,但容量极小(几十 KB~几百 KB),行业内也称 BL1。
弥补 BootROM 的硬件初始化短板,解决“DDR 未初始化、无法加载大容量 UBoot”的核心问题:
UBoot 体积大(几百 KB~数 MB),无法在极小的片内 SRAM 运行;且 DDR 未初始化前无法使用,SPL 的唯一使命就是初始化 DDR、为 UBoot 搭建运行环境。
DDR 大容量内存运行,是开发者最熟悉的启动阶段,属于开源可定制引导程序(BL2)。
SPL 仅初始化核心硬件,UBoot 完成全板级硬件初始化和内核启动参数配置,是启动流程中功能最丰富的阶段:
屏蔽不同板级硬件差异,统一内核启动入口,支持手动调试、网络烧录、启动顺序切换,是开发调试的核心阶段。
DDR 内存中正式运行,接管整个系统硬件资源。
内核接手后,不再依赖 UBoot,完成系统内核层初始化:
Kernel 只负责硬件调度、资源管理、内核服务初始化,不包含任何用户程序、命令行、应用功能,必须依赖 RootFS 才能完成完整系统启动。
RootFS 是 Linux 的根文件系统,是系统所有文件、命令、库、配置、应用程序的载体,是系统“活过来”的最后一步。
Kernel 是系统的“大脑和骨架”,RootFS 是系统的“血肉和工具库”。没有 RootFS,内核只会卡死在启动最后一步,无法交互、无法运行任何程序。
| ROM Boot | ||
| BootROM(BL0) | ||
| SPL(BL1) | ||
| UBoot(BL2) | ||
| Kernel | ||
| RootFS |
一句话记忆:
ROM 选路 → BootROM 搬 SPL → SPL 开 DDR 搬 UBoot → UBoot 初始化全硬件搬内核 → Kernel 接管系统挂 RootFS → 系统可用 ✅
答:UBoot 体积大、需要 DDR 运行,BootROM 无法初始化 DDR,SPL 专门负责初始化 DDR,为 UBoot 搭建运行环境。
答:bootargs 根文件系统参数错误、设备树不匹配、存储驱动未加载、DDR 初始化异常。建议先确认 bootargs 中的 root= 路径是否正确。
答:UBoot 负责硬件初始化、搬运内核、传参;Kernel 负责系统资源管理、驱动调度、拉起用户环境。
📌 总结:嵌入式 Linux 的多级启动,本质上是在“硬件资源极度受限”的条件下,通过逐层接力、逐级扩容,最终跑起一个完整操作系统。每一层都有其不可替代的作用,理解这个链条,才能从容应对启动调试和面试拷问。
如果觉得这篇文章对你有帮助,欢迎点赞、收藏、转发,让更多嵌入式软件爱好者看到!
往期文章(欢迎订阅技术分享栏目全部文章):

这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助