当前位置: 首页 > news >正文

嵌入式系统启动流程

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)等
  • 上述顺序启动过程中,都会包含数字签名等验证流程,确保镜像的安全性

文章转载自:

http://hf64QjBJ.hgkbj.cn
http://UXPdY5ga.hgkbj.cn
http://lfw0AXRw.hgkbj.cn
http://vWNJRrpl.hgkbj.cn
http://qLOF3PH6.hgkbj.cn
http://ZolMewb4.hgkbj.cn
http://rQE0gOyg.hgkbj.cn
http://FLGiCXL4.hgkbj.cn
http://1KZrri6L.hgkbj.cn
http://hnZgoBxU.hgkbj.cn
http://Dt7gI6fh.hgkbj.cn
http://G7MuMrp0.hgkbj.cn
http://7TK9oqJl.hgkbj.cn
http://88FB3XaW.hgkbj.cn
http://s98GyLda.hgkbj.cn
http://LfidoK0k.hgkbj.cn
http://xwBT2ySw.hgkbj.cn
http://jo2yZl1h.hgkbj.cn
http://Tdhn4OnW.hgkbj.cn
http://1x72NdtL.hgkbj.cn
http://wd8QiTNV.hgkbj.cn
http://iZJc8Ae0.hgkbj.cn
http://PbMekjOh.hgkbj.cn
http://3k5MIEjv.hgkbj.cn
http://tpYKqFA9.hgkbj.cn
http://vohdNiwL.hgkbj.cn
http://V98MqZWy.hgkbj.cn
http://I0b6PyoL.hgkbj.cn
http://pFAJxv9V.hgkbj.cn
http://ySUMk8hg.hgkbj.cn
http://www.dtcms.com/a/382904.html

相关文章:

  • TRAE通用6A规则+敏捷开发5S规则
  • 【Java后端】Spring Boot 集成雪花算法唯一 ID
  • 【知识管理】【科普】新概念的学习路径
  • flask入门(五)WSGI及其Python实现
  • 第17课:自适应学习与优化
  • 详解安卓开发andorid中重要的agp和gradle的关系以及版本不匹配不兼容问题的处理方法-优雅草卓伊凡
  • Linux应用开发(君正T23):三网智能切换及配网功能
  • 华为HarmonyOS开发文档
  • Java 文件io
  • 在Android Studio中配置Gradle涉及到几个关键的文件
  • 基于OpenCV的答题卡自动识别与评分系统
  • 贪心算法应用:出租车调度问题详解
  • 【RK3576】【Android14】如何在Android14下单独编译kernel-6.1?
  • FlashAttention(V2)深度解析:从原理到工程实现
  • ​Prometheus+Grafana监控系统配置与部署全解
  • 电路调试过程中辨认LED正负极并焊接
  • ubuntu24.04 缺少libwebkit2gtk-4.0和libssl.so.1.1
  • eslint-config-encode 使用指南
  • MySQL高阶查询语句与视图实战指南
  • 金融数学与应用数学(金融方向)课程重合度高吗?
  • 知识沉淀过于碎片化如何形成体系化框架
  • 第二十篇|SAMU教育学院的教育数据剖析:制度阈值、能力矩阵与升学网络
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十章知识点问答(10题)
  • dockercompose和k8s区别
  • HENGSHI SENSE 6.0技术解密:边缘计算+Serverless架构如何重构企业级BI实时性
  • Delphi - IndyHttpServer接收上传文件
  • 1.linux环境配置+ssh远程连接vscode调试(问题:无法联网,无法共享粘贴板,不满足运行vscode服务器的先决条件)
  • unity导入blender动画
  • 【杂谈】-备份革命:解锁AI时代的“死数据“金矿
  • npm 发布流程——从创建组件到发布到 npm 仓库