
本文概述
启动流程是嵌入式Linux工程师的系统级基本功,面试官想听的不是背几个阶段名,而是你懂不懂从上电复位到U-Boot再到内核、根文件系统的完整链条,以及每个阶段在干什么、出问题了怎么定位。本文从“启动是分阶段接力”讲起,讲芯片内部的启动ROM/BL、U-Boot的初始化与引导、内核启动(解压、setup、驱动初始化)、挂载根文件系统到init,再讲启动卡在哪个阶段怎么定位,强调具体启动顺序和介质由芯片方案决定,不套固定模板。
核心要点
启动是分阶段接力:芯片BootROM→U-Boot→内核→根文件系统→init,每一阶段接力下一阶段
U-Boot作用:初始化硬件、加载内核/设备树/根文件系统镜像到内存、传启动参数给内核
U-Boot引导:读取bootcmd、加载镜像、bootm启动,环境变量和启动介质可配置
内核启动:自解压→setup→体系架构初始化→驱动probe→挂载根文件系统→执行init
根文件系统与init:内核启动后挂载rootfs,执行第一个用户进程(init/systemd)
启动卡死定位:先看串口输出在哪个阶段停住,按阶段排查(BootROM/U-Boot/内核/rootfs)
面试官考察点
考察点拆解
面试官问启动流程,重点考察:第一,你懂不懂启动是分阶段接力,清楚每个阶段做什么、谁接管谁;第二,你懂不懂U-Boot的具体职责(加载内核、传参、环境变量);第三,你懂不懂内核启动到rootfs、init的链条;第四,你会不会在启动卡死时按串口输出分阶段定位——这是嵌入式工程师最实用的能力。
追问方向:U-Boot和内核怎么交接、bootcmd是什么、启动卡在U-Boot怎么办、内核启动到哪一步了怎么判断、根文件系统挂载失败怎么查。
回答思路
答题主线
建议按“整体链条 → U-Boot阶段 → 内核阶段 → rootfs与init → 定位方法”来答,先建立全链路框架再逐段深入。
先讲整体链条:BootROM→U-Boot→内核→rootfs→init。
讲U-Boot:初始化、加载镜像、传参、环境变量。
讲内核:解压、初始化、驱动、挂载rootfs。
讲定位:按串口输出分阶段排查。
参考回答
我先讲整个启动链条,再分段深入。
第一,整体链条。嵌入式Linux启动是分阶段接力:
芯片BootROM → U-Boot → Linux内核 → 根文件系统 → init(第一个用户进程)
每个阶段完成自己的事,然后跳转到下一阶段。具体启动介质(eMMC、SPI Flash、SD、网络)和顺序由芯片方案和U-Boot配置决定。
第二,U-Boot阶段。U-Boot是启动引导程序,职责:
硬件初始化:初始化时钟、DDR、串口、存储等基础硬件;
加载镜像:从启动介质读取内核(uImage/zImage)、设备树(dtb)、根文件系统镜像到内存;
传参给内核:通过bootargs(内存大小、root设备、console等)或设备树把启动信息传给内核;
启动内核:执行bootcmd(启动命令),通常调用bootm启动内核。
U-Boot的环境变量(如bootcmd、bootargs)可配置,是调整启动行为的关键。
第三,内核阶段。U-Boot跳转到内核后:
内核自解压(zImage)或直接执行;
体系架构初始化(CPU、内存、中断、时钟);
驱动初始化:设备模型、总线、各驱动probe,挂载根文件系统;
执行第一个用户进程init(如busybox init或systemd),进入用户空间。
根文件系统挂载失败、init缺失都会导致内核起不来或卡住。
第四,定位方法。启动卡死时,最有效的办法是看串口输出,看它停在哪个阶段:
停在U-Boot之前:芯片BootROM或时钟/DDR初始化问题;
停在U-Boot加载:镜像不存在、介质错误、加载地址不对;
U-Boot启动了内核但没进用户空间:内核初始化卡住、驱动probe失败、rootfs挂载失败;
rootfs挂载失败:文件系统类型、设备节点、bootargs的root参数不对;
init起不来:rootfs里缺init或init崩溃。
按这个链条逐段定位,配合打印信息和硬件检查,就能缩小问题范围。

扫码关注





























