ARM 系统启动通常可以分为两个阶段:
- 硬件初始化阶段
- 软件启动阶段
前者负责让芯片和基础外设进入可运行状态,后者负责把控制权逐步交给 Bootloader、内核或应用。
1. 硬件初始化阶段
处理器上电后,最先执行的是固化在 ROM、Flash 或 SoC 启动介质中的初始化代码。这个阶段的目标是建立最小可运行环境,常见工作包括:
- 初始化时钟和复位逻辑
- 配置中断控制器
- 初始化串口,便于早期调试输出
- 初始化 RAM、Flash 或其他启动介质
- 配置必要的总线和基础外设
这一阶段通常由芯片厂商提供底层支持,代码规模较小,但决定了后续系统是否能顺利进入软件启动流程。
2. 软件启动阶段
硬件初始化完成后,处理器开始执行启动介质中的软件代码。大多数系统会先进入 Bootloader,再由 Bootloader 加载操作系统或应用程序。
软件启动阶段通常包括:
- 初始化更完整的运行环境
- 初始化内存管理
- 初始化更多外设
- 加载内核映像、设备树、根文件系统或应用镜像
- 设置启动参数
- 将控制权交给内核或主程序
3. Bootloader 的职责
Bootloader 是硬件初始化和操作系统之间的桥梁,常见职责包括:
- 进一步初始化 DDR、串口、存储接口
- 校验镜像有效性
- 从 Flash、eMMC、SD 卡、网络等介质加载镜像
- 设置内核启动参数
- 跳转到内核入口地址
在 Linux 系统中,常见做法是由 Bootloader 加载内核和设备树,然后进入内核启动流程;在 RTOS 或裸机场景中,也可能直接加载应用程序。
4. Linux / RTOS 场景差异
Linux 场景
典型路径是:
上电 -> ROM/固化代码 -> Bootloader -> Linux Kernel -> 用户空间
特点:
- 启动链较长
- 对内存、设备树、根文件系统依赖较强
- 更适合复杂系统
RTOS 场景
典型路径是:
上电 -> 固化代码/Bootloader -> RTOS -> 应用任务
特点:
- 启动链相对更短
- 系统结构更轻量
- 更强调实时性和资源受限环境下的稳定性
5. 启动流程的核心关注点
分析 ARM 启动流程时,建议重点关注以下问题:
- 第一段代码从哪里开始执行
- 早期可用内存何时建立
- 串口日志最早从哪里打印
- Bootloader 和内核的职责边界是什么
- 设备树、根文件系统或应用镜像如何被加载
- 启动慢的瓶颈位于硬件初始化、存储读取还是内核初始化
6. 总结
ARM 启动流程本质上是在逐步建立运行环境:
- 先让硬件可用
- 再让软件具备加载能力
- 最后把控制权交给内核或应用
理解这个过程的关键,不在于记住所有细节,而在于清楚每个阶段“谁在执行、做了什么、交给谁”。