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 管脚复用,数据总线和地址总线复用。NOR FLASH 有地址总线和数据总线,可以直接连接到系统总线上、支持随机存取
  • NAND Flash 支持页级别的随机访问,但不支持字节级别的随机访问。
  • NOR Flash:支持字节级的随机访问,CPU 可以直接通过地址线读取任意一个字节并执行代码(即 XIP, Execute-In-Place)
  • NAND Falsh 通常需要一个控制器去控制(例如很多 SOC 上的 NAND Flash 控制器)。而 NOR Flash 则不需要,它不需要单独的控制器去控制。
  • NAND/NOR Flash 都可以通过 SPI 总线控制。有些是否为了节省成本,省去布线的麻烦,都用 SPI 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)等
  • 上述顺序启动过程中,都会包含数字签名等验证流程,确保镜像的安全性
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐