嵌入式系统启动流程
1、基础概念
1.1 bootrom
BootROM 不是严格意义上“只能从 ROM 启动操作系统” 的意思,而是指芯片上电复位后,第一段固定的启动程序,通常固化在 ROM(只读存储器)或 mask ROM、OTP ROM,甚至是 eFuse 或者内嵌 Flash 中。
它的职责是:
- 初始化最基本的硬件环境(如时钟、SRAM、引脚模式)
- 决定启动介质(NAND、NOR、SPI Flash、SD 卡、USB、UART 等)
- 搬运/加载下一阶段的 bootloader 到片内 SRAM。
换句话说,BootROM 是 SoC 厂商写死的第一阶段代码,它并不等于“操作系统”,而是负责把后续代码拉起来。
广义上,ROM 可以指的存储器:
- 真·只读存储器(mask ROM,无法更改)
- eFuse/OTP(一次性可编程)
- 内嵌 Flash(有些 MCU/SoC 用它代替 mask ROM)。
在有些资料中,厂商也会把 BootROM + NAND/NOR 的启动扇区统称为“ROM”,这是习惯性说法。
1.2 bootloader
bootloader 本身就是一个广义的概念,它并不是指某一个特定的软件,而是指 “在操作系统启动之前运行的所有引导程序”。可以是单级的,也可以是多级分层的。
🔹多级引导的层次划分
不同的芯片/架构可能会分为多级:
- ROM Code / BootROM(第 0 级)
- 固化在 SoC 内部,不可修改
- 上电后 CPU 首先执行
- 职责:最小化初始化、选择启动介质、加载第一级 bootloader 到 SRAM
- 一级 bootloader(Stage 1 Bootloader / SPL,通常很小)
- 由开发者提供,存放在启动介质的最前面
- 通常运行在片内 SRAM(容量有限,比如 S3C2440 只有 4KB)
- 职责:初始化 DRAM、NAND 控制器,加载更大的二级 bootloader
- 二级 bootloader(Stage 2 Bootloader,例如 U-Boot)
- 存放在 NAND/NOR/SD 等存储器中,由一级 bootloader 搬运到 DRAM 后运行
- 功能完善:外设驱动、文件系统、网络下载、命令行、烧写功能、加载内核
- 三级引导(有些系统才有)
- 比如 U-Boot 本身可以分 SPL(小的前置程序)+ main U-Boot
- 或者在 PC 上的 BIOS/UEFI → boot sector → GRUB → OS
这里说的 “三级引导” 并不是一个固定的、标准的术语,而是想强调,在某些系统里,bootloader 可以再拆得更细,例如。严格来说,大家常用的叫法通常只有 BootROM → Stage 1 → Stage 2 → OS,但不同的社区/文档里命名方式会有点出入。
- 最终操作系统内核
- bootloader 的最后一步就是把内核搬到内存合适位置,并跳转到入口点执行
2、以 S3C2440 为例
S3C2440 的启动时读取的第一条指令是在内存 0x00 地址处(注意:对于S3C2440芯片设计为0x0,其他芯片不一定)。
上电后内存中没有数据,那么 0x00 地址处的指令如何放进去?
我们首先要了解一个基础知识:NAND FLASH 不可以直接运行程序,而 NOR FLASH 却可以(片上执行)。
- NAND FLASH 管脚复用,数据总线和地址总线复用
- NAND FLASH 是顺序存取设备,不能够被随机访问
- 所以,NAND FLASH 本身是连接到了控制器上而不是系统总线上
- NOR FLASH 有地址总线和数据总线,可以直接连接到系统总线上、支持随机存取
2.1 NAND 启动
板卡出厂的时候,厂家会在 NAND FLASH 中固化相关启动镜像。
上电后,2440 硬件会自动从 Nand Flash 中读取 4K 到片内 RAM 上(SRAM),同时片内 RAM 上前 4K 被映射到[内存]的 0x0 地址处(映射的过程也是硬件的自动操作的过程)。CPU 从 0 地址上读取第一条指令(前4字节),执行…
- stage1:Reset 复位后,Nand Flash 控制器将 Nand 前 4K 代码复制到 SRAM 中运行(这部分代码可以理解为 SPL)
- stage2:这部分代码负责配置内存和 Flash,然后将 uboot 代码复制到内存(DDR)中,然后跳转到内存中运行(可以理解为 Uboot)
- stage3:最后 uboot 启动 Linux 内核(OS),然后内核去挂载根文件系统,进入命令行启动应用程序(可以理解为 OS)
2.2 NOR 启动
板卡出厂的时候,厂家会在 NOR FLASH 中固化相关启动镜像。
如果配置为 NOR FLASH 启动,0x00000000 就是 NOR FLASH 实际的起始地址,NOR FLASH 中的程序就从这里开始运行,不涉及到数据拷贝和地址映射。
- stage1:Reset 复位后,程序直接从 NorFlash 开始运行,初始化内存,将 uboot 拷贝到内存中
- stage2:跳转到内存中运行,然后启动内核。
3、ARM 架构中的安全启动
推荐先阅读:
ARM 学习笔记(一)
ARM 学习笔记(二)
3.1 TrustZone
🔹TrustZone 的起源
- 时间背景:
- 2003 年左右 ARM 推出 ARMv6K 架构时,已经有了最早的 TrustZone 技术雏形;
- 真正普及是在 ARMv7-A(Cortex-A 系列)开始,尤其是智能手机爆发时期(2005–2010)。
- 动机:在此之前,嵌入式系统大多数是单一用途(比如机顶盒、打印机),不太需要复杂的安全隔离。但随着手机、平板 等 开放应用平台 出现,情况变了:
- 手机要能安装第三方 APP;
- 手机要处理安全敏感任务(SIM 卡、支付、DRM、VPN、企业安全);
- 同一台设备要承载 “可信代码” 和 “不可信代码”。
这就迫使 ARM 提供一种硬件级别的隔离机制:让 CPU 在同一核心上也能划分出 安全世界 (Secure World) 和 普通世界 (Normal/Non-secure World)。
🔹为什么需要 TrustZone
- 软件隔离不够安全
- 单纯靠 OS 内核做隔离(用户态 vs 内核态)不足以抵御恶意软件
- Android/Linux 内核本身可能有漏洞,一旦被利用,安全功能就会被绕过。
- 可信执行环境 (TEE) 的需求
- 电信运营商要保护 SIM 卡相关的密钥;
- 内容提供商要保护 DRM;
- 金融厂商要保护支付/加密逻辑;
- 企业要保证设备管理和 VPN 通道可信。
👉 这些功能不能和普通 APP 跑在一起,需要有个小而可信的“安全小环境”
- 硬件生态统一
- 如果让每家厂商自己搞一套安全处理器,碎片化会严重。
- ARM 直接在 CPU 架构里内置一个“安全世界”支持,大家就能基于统一机制开发。
🔹 TrustZone 的设计核心
- 世界切换 (World switch):
- CPU 引入了 Secure/Non-secure 状态位 (NS bit)。
- 指令 smc (Secure Monitor Call) 用来在两个世界之间切换。
- 硬件隔离:
- 内存、外设都带有安全属性(比如 MMU + TrustZone Address Space Controller(TZASC))。
- 普通世界不能直接访问安全世界的资源。
- 安全监控器 (Secure Monitor):
- 相当于世界切换时的“中介”,运行在最高特权级,保证切换过程不会被篡改。
3.2 Trusted Firmware(ATF)
TF(Trusted Firmware)是 ARM 在 Armv8 引入的安全解决方案,为安全提供了整体解决方案。它包括启动和运行过程中的特权级划分,对 Armv7 中的 TrustZone(TZ)进行了提高,补充了启动过程信任链的传导,细化了运行过程的特权级区间。
处理器的执行特权等级基于异常级别(EL)划分:
- EL0(应用层级)可分为安全(Secure)与非安全(No-Secure)状态
- EL1(操作系统层级)可分为安全(Secure)与非安全(No-Secure)状态
- EL2(虚拟机监控器层级)在Armv7-A至Armv8.3-A架构中仅支持非安全状态。从Armv8.4-A架构开始,EL2可支持安全与非安全状态
- EL3(安全监控器层级)仅存在于安全域——安全与非安全状态间的软件驱动转换仅能在此层级实现
从高 EL 转低 EL 通过 ERET 指令,从低 EL 转高 EL 通过 exception,从而严格区分不同的特权级
ATF 相关源码可以学习:
https://github.com/ARM-software/arm-trusted-firmware
关于 ATF 启动这里先整个宏观的概念。这个 blog 讲的很好,就不重复写了,自己写还写不到这么清晰,图页很漂亮。
ARM Trusted Firmware分析——启动、PSCI、OP-TEE接口
这里直接贴图:
这里就直接上总结,总结下我个人觉得比较重要的东西。
- BL1 通常是 bootrom,运行在 EL3,初始化相关硬件,加载 BL2
- BL2 通常运行在 SRAM 中,运行在 EL1,初始化相关硬件(DRAM)
- BL2 会搬运 BL31、BL32、BL33 到 DRAM 中
- BL1、BL2 都是一次性的,系统启动后,不再起作用。系统运行期间,一直起作用的是 BL31、BL32、BL33
- BL31 比较重要,运行在 EL3,它通过 smc 指令为 Non-Secure World 持续提供涉及安全的服务。提供 PSCI 电源管理功能(例如 CPU 的使能)、安全非安全世界切换(World Switch)等
- 上述顺序启动过程中,都会包含数字签名等验证流程,确保镜像的安全性