1 Star 3 Fork 0

unicornx / tblog

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
20240329-duo-bootflow.md 6.87 KB
一键复制 编辑 原始数据 按行查看 历史
unicornx 提交于 2024-04-03 07:46 . improved text for duo boot process

文章标题:聊一聊 MilkV-Duo 的启动流程

文章大纲

Milk-V Duo 是一个基于 CV1800B 芯片的超紧凑嵌入式开发平台。它有两个 RISC-V 核,可以分别运行 Linux 和 RTOS(譬如 FreeRTOS),为专业人士、工业 ODM、AIoT 爱好者、DIY 爱好者和创作者提供了一个可靠、低成本和高性能的平台。具体参考 官网介绍

MilkV Duo 支持安全启动(Secure Boot)的概念,并且借用了 ARM 下的 Trusted Firmware 技术。本文先简单介绍一下什么是安全启动以及 ARM 提出的用于安全启动的 Trusted Firmwar 技术,最后基于以上概念介绍了 MilkV Duo 的安全启动流程。

安全启动流程

安全启动流程,也称为安全启动、安全引导或可信启动,是一种用于确保计算机系统在启动时运行的固件和软件是受信任的、未被恶意篡改的机制。该机制旨在保护计算机系统免受恶意软件和恶意攻击,最终保护用户的隐私和计算机系统的安全性。

安全启动流程的基本原理是在系统启动时从 BootROM 开始逐级检查启动固件或者软件的完整性和真实性,以确保它们是由授权的、可信任的实体签名的。以一个简单的典型嵌入式系统的启动流程为例,这个过程包括以下步骤(注意不同的系统的启动流程可能不同,下图只是简单示意一下所谓的逐级启动和验证的概念):

  • (1)计算机上电,CPU 将 ROM 中的 Boot (习惯上也称 BootROM)指令加载到 SRAM 中执行,Boot 指令会对硬件进行自检,以确保它们都能正常工作。

  • (2)BootROM 将 Boot Loader 从 Flash 加载到 DRAM 中,同时检查其完整性和真实性,以确保它没有被篡改。验证通过后跳转到 Boot Loader 开始执行。

  • (3)Boot Loader 负责将 Operating System 从 Flash 中加载到 DRAM 中,检查其完整性和真实性,通过后跳转到 Operating System 的入口,操作系统开始执行。

  • (4)操作系统负责执行其他的应用程序并验证其安全性。

通过这些步骤,从 ROM 中的 Boot(我们也常称之为 BootROM)开始,逐级通过 Boot Loader、以启动操作系统。我们假设 Boot Loader 和 Operating System 镜像都被保存在 Flash上,则在启动时,各级启动程序都需要从 Flash 中加载下一级启动镜像。安全启动流程确保了计算机系统在启动时的安全性和完整性,并防止了恶意软件和攻击者对计算机系统的篡改和入侵。

Arm Trusted Firmware Secure Boot

Arm 通过一个名为 Trusted Board Boot Requirements (TBBR)(即 Arm Trusted Firmware (ATF) 安全启动)的架构定义了一个可信启动过程。TBBR 的工作原理是,验证一系列加密签名的二进制镜像,每个镜像都包含系统启动过程中需加载和执行的不同阶段或元素。每个启动加载程序 (BL) 阶段都会完成初始化过程中的不同阶段, 下面列举了整个 ATF 冷启动实现分为 5 个步骤以及对应的 Bootloader 固件:

  • 第 1 阶段 BL1: 处理器上运行的第一段指令,通常固化在 ROM 中不可修改,也被称为 “Trusted ROM”。其主要目的是为后继的加载执行所需的最小初始化工作,并对下一阶段的 BL2 image 执行安全验证,并将其加载到 RAM 中执行,也就是将处理器的控制权移交给 BL2
  • 第二阶段 BL2: 第 2 阶段运行的固件。它目前也被称为 “Trusted Boot Firmware”。其主要工作是执行 BL1 工作之外的其他初始化。并将所有第 3 阶段的固件加载到具有可执行属性的 RAM 位置并对其进行验证,然后将控制权移交给第 3 阶段固件。和 BL1 不同,BL2 以及之后阶段的固件一般是可升级更新的。
  • 第 3 阶段运行的固件,按照加载和执行顺序,进一步细分成三个阶段(即,BL31 -> BL32 -> BL33)。
    • BL31: 也称为 “EL3 Runtime Firmware”,其主要目的是处理 normal 世界和 secure 世界之间的过渡。注意这里的 EL3 指的是 ARM 术语中的 Exception Levels(异常级别)的概念。譬如 ARMv8 架构定义了一组四个异常级别(EL0、EL1、EL2 和 EL3),每个 EL 具备不同的可执行权限,就执行权限而言,EL0 < EL1 < EL2 < EL3。参考 AArch64 Exception Levels
    • BL32: Secure-EL1 Payload,一般为 TEE OS Image,该阶段的固件其实现是可选的。
    • BL33: Non-Trusted Firmware 或者叫 Normal World Firmware。例如 UEFI 或者 U-boot,主要目的时用来引导和启动 normal 世界的操作系统。

Duo 的安全启动流程

Duo 的安全启动流程参考了 ATF 的实现并将其移植到 RISC-V 上。

根据 ATF 的规范定义,所有固件可以统一打包成单独的符合 FIP (Firmware Image Package) 格式的二进制文件。该文件 Duo 命名为 fip.binfip.bin 文件中包含了以下内容:

  • Metadata,文件头部分。
  • FSBL(First Stage Boot Loader),FSBL 对应于 ATF 中的 BL2
  • DDR param,用于 DRAM 的初始化。
  • FreeRTOS,FreeRTOS 是一个开源的实时操作系统,Duo 的小核 C906L 会运行它。
  • OpenSBI,对应于 ATF 中的 BL31
  • AE param
  • U-Boot,对应于 ATF 中的 BL33

Duo 上电后,首先从大核 C906B 开始启动,顺序如下图所示:

  • (1)C906B 在 ROM 中直接运行 Boot 指令。
  • (2)Boot 将 AE Param 加载到 SRAM 中。
  • (3)Boot 将 FSBL 加载到 SRAM 中。Boot 验证 FSBL 通过后跳转到 FSBL 执行。
  • (4)FSBL 将 DDR param 加载到 SRAM 中并完成对 DRAM 的初始化。
  • (5)FSBL 将 FreeRTOS 加载到 DRAM 中并交给小核 C906L 运行。
  • (6)FSBL 将 OpenSBI 加载到 DRAM 中并验证之。
  • (7)FSBL 将 U-boot 加载到 DRAM 中并验证之。
  • (8)FSBL 跳转到 OpenSBI,将大核运行交给 OpenSBI。
  • (9)OpenSBI 之前 (包括 OpenSBI) C906B 一直运行在 RISC-V 的 Machine 模式,OpenSBI 完成系统初始化后会切换机器模式并跳转到 U-boot,此后 C906B 将运行在 RISC-V 的 Supervisor 模式。
  • (10):U-boot 继续加载 Linux 并最终将 C906B 交给 Linux。

参考

  • Armed to Boot: an enhancement to Arm's Secure Boot chain 1
  • AArch64 Exception Levels 2
1
https://gitee.com/unicornx/tblog.git
git@gitee.com:unicornx/tblog.git
unicornx
tblog
tblog
master

搜索帮助