SoC 启动流程深度解析:从芯片上电到系统运行的奥秘
Part1:SoC 是什么?
SoC 的核心组件与应用场景
智能手机:集成高性能 CPU 和 GPU,支持流畅的日常应用与游戏;4G/5G 通信模块实现高速联网;电源管理单元优化续航。
智能家居:通过低功耗处理器与传感器模块联动,实现设备智能化控制。
自动驾驶汽车:集成 AI 加速单元与多传感器接口,支撑环境感知与决策计算。
Uboot 启动前的关键准备
(1)链接脚本与程序入口
(2)镜像容器
(3)SPL 的启动
初始化基础模块(如时钟、串口)与 DDR 内存;
加载下一级镜像(Uboot)。
初始化 ARM 处理器;
初始化串口控制台(用于输出调试信息);
配置时钟与基础分频;
初始化 SDRAM(为 Uboot 运行提供内存空间);
配置引脚多路复用功能;
初始化启动设备(如 SPI Flash、eMMC);
加载完整 Uboot/kernel 程序并转交控制权。
(4)ATF 的启动
Uboot 的初始化过程
(1)Uboot 的启动
保存上一级镜像传入的参数;
检查代码段 4k 对齐性;
重设 SCTLR(系统控制寄存器);
设置异常向量表(用于处理中断与异常)。
(2)驱动的初始化
串口驱动:设置波特率、数据位、停止位,使能中断,实现调试信息输出与用户输入交互;
存储驱动:初始化 SPI Flash、eMMC 等设备,为加载内核做准备;
网卡驱动:配置网络接口,支持通过 TFTP 加载镜像。
(3)交互原理
help:显示所有命令及说明;
printenv:查看环境变量;
setenv:修改环境变量(如设置内核启动参数);
saveenv:保存环境变量(掉电不丢失)。
kernel 的初始化过程
(1)内核运行的第一行代码
设置栈指针;
初始化关键寄存器;
为后续 C 语言代码执行搭建环境。
(2)head.S 的执行过程
初始化页表(为开启 MMU 做准备);
开启 MMU(内存管理单元),实现虚拟内存映射;
设置内核堆栈(为内核线程运行提供栈空间)。
(3)内核子系统启动全流程
进程管理:创建第一个进程init(PID=1),启动内核线程;
内存管理:初始化物理内存分配器(如 Buddy 系统)与虚拟内存管理;
设备驱动:加载并初始化各类硬件驱动(如网卡、存储控制器);
文件系统:挂载根文件系统,为用户态程序提供运行环境。
Part2:SoC 启动全流程解析
2.1 上电初始化
2.2 加载操作系统或固件
BootROM 从指定启动设备(如 eMMC、SPI Flash)加载 SPL 至 SRAM;
SPL 初始化 DDR 后,加载 Uboot 至 DDR;
Uboot 完成硬件初始化,加载内核与设备树至 DDR;
Uboot 将控制权交给内核,内核启动并挂载根文件系统。
2.3 任务执行阶段
用户态程序:启动应用进程(如手机的桌面程序、智能家居的控制逻辑);
硬件交互:通过驱动程序与外设通信(如读取传感器数据、控制显示屏);
资源调度:内核根据任务优先级调度 CPU、内存等资源,确保系统高效运行。
Part3:不同类型 SoC 启动的特点
3.1 以单片机为例的简单启动
通过串口或 JLINK 工具将程序烧录到片上 Flash;
上电后,硬件自动设置 SP(堆栈指针)与 PC(程序计数器):
PC 指向 Flash 中程序的起始地址,按顺序执行指令;
SP 用于存储变量与函数调用上下文;
启动文件(由开发软件自动生成)完成:
初始化堆栈与程序计数器;
将数据段(data)与未初始化数据段(bss)复制到 RAM;
调用main函数,进入用户程序执行阶段。
3.2 复杂 SoC 的多阶段启动
BootROM 阶段:厂商固化在内部 ROM 的程序,负责加载 SPL 至 SRAM(因初期无法访问外部存储);
SPL 阶段:初始化 DDR 与关键外设,加载 Uboot 至 DDR(受 SRAM 容量限制,SPL 代码需精简);
Uboot 阶段:运行在 DDR 中,完成全量硬件初始化,加载内核与设备树,最终启动操作系统。
Part4:SoC 启动与 MCU 启动大不同
对比维度 | SoC | MCU |
硬件架构 | 集成 CPU、GPU、内存、多外设,如大型城市 | 集成简单 CPU、少量内存与基础外设,如小村庄 |
启动速度 | 需加载操作系统与大量驱动,启动较慢(秒级) | 无复杂系统,启动快速(毫秒级) |
启动模式 | 支持多设备启动(eMMC、SD 等),依赖 Bootloader | 多从片上 Flash 启动,无需复杂引导 |
电源管理 | 需 PMU 控制多模块供电顺序,功耗管理复杂 | 单一电源域,启动时只需基础供电 |
应用场景 | 智能手机、智能驾驶(复杂功能设备) | 家电控制、传感器节点(简单控制场景) |
Part5:SoC 启动常见问题与解决办法
5.1 硬件相关问题
BOOT 引脚设置错误:导致芯片选择错误启动设备(如误选 SPI Flash 而非 eMMC)。解决:检查引脚连接与电平设置,确保与设计预期一致。
复位键未拉高:NRST 引脚持续低电平导致芯片一直复位。解决:测量引脚电平,排查电路短路或外部复位信号异常。
电压与晶振问题:供电电压不足或晶振频率与程序配置不匹配(如晶振实际 16MHz,程序按 8MHz 配置)。解决:用万用表测电压,核对晶振参数与代码配置。
固件与芯片不匹配:固件针对的芯片型号与实际不符,导致硬件无法识别。解决:确认固件版本与芯片型号一致性。
5.2 软件及其他问题
Uboot 重定位失败:Uboot 无法从低地址内存移至高地址,导致内核无足够空间。解决:检查链接脚本中的内存布局,确保重定位地址合法。
启动时间过长:冗余初始化步骤拖慢启动。优化:精简 SPL 代码,延迟非必要外设初始化,启用快速启动模式(跳过部分自检)。
休眠唤醒异常:从休眠恢复时状态丢失。解决:确保休眠时关键状态正确保存至非易失性存储(如 eMMC)。



