文章目錄
- 1、環境介紹
- 2、前言
- 3、ARM TrustZone
- 3.1、什么是ARM TrustZone
- 3.2、cpu特權等級
- 3.3、ARM Trusted Firmware
- 4、Rockchip 平臺的 Trust
- 4.1、實現機制
- 4.2、啟動流程
- 4.3、生命周期
- 4.4、Trust 編譯打包流程分析
- 5、總結
1、環境介紹
硬件:飛凌ok3568-c開發板
軟件:原廠rk356x sdk(Linux)
2、前言
最開始的目的是為了了解 RK3568 的安全啟動,但在學習過程中不小心先了解了 Rockchip Trust。后來發現,安全啟動本身的實現并不依賴 Trust。不過,Trust 的存在可以在系統運行時提供更細粒度的安全保障,使得整體安全策略更完善。
關于 Rockchip 平臺上 Trust 的實現和作用,在官方文檔《Rockchip_Developer_Guide_Trust_CN.pdf》
已有詳細介紹。本文主要記錄個人學習后的總結。
3、ARM TrustZone
在此之前,需要先理清ARM TrustZone、cpu特權等級、ARM Trusted Firmware、OP-TEE OS等名詞概念,可以直接參考《Rockchip_Developer_Guide_Trust_CN.pdf》
,本章節僅做個小結。
3.1、什么是ARM TrustZone
ARM TrustZone是一個硬件機制,是ARM公司在CPU和SoC中提供的一種硬件安全擴展機制
。
核心思想就是把一個系統劃分成安全世界 (Secure World) 和非安全世界 (Normal World)。安全世界可以訪問所有資源(安全 + 非安全),非安全世界只能訪問屬于自己的資源,嘗試訪問安全資源會被硬件阻止。
3.2、cpu特權等級
CPU 特權等級(Exception Level,EL) 定義了 CPU 執行代碼的權限級別。系統中運行的每個任務都有一個對應的特權等級,用來表示它的權限大小。不同 EL 可以訪問的資源和可執行的指令不同,EL 越高權限越大。對于 AArch64(64 位 ARM)架構,CPU 特權等級主要分為 EL0~EL3:
- EL0:用戶態應用,權限最小,只能訪問普通資源。
- EL1:內核態,權限較高,可訪問系統資源和控制硬件。
- EL2:Hypervisor(虛擬化管理),管理虛擬機。
- EL3:Secure Monitor,權限最高,負責安全/非安全世界切換。
3.3、ARM Trusted Firmware
上面提到ARM TrustZone是硬件層面的,有了硬件隔離,還需要軟件來管理和使用:
- ARM Trusted Firmware (TF-A): 是 ARM 官方提供的一套開源固件,運行在 EL3(最高特權級),提供“世界切換”的管理程序 Secure Monitor。
- OP-TEE OS: 是一個輕量級操作系統,專門運行在安全世界 EL1,提供安全服務,比如密鑰管理、加密、認證。
- 普通 OS(Linux/Android):運行在非安全世界,只能通過調用(SMC 指令)去請求安全服務。
所以,TrustZone 提供硬件隔離。TF-A 和 OP-TEE 在這個硬件基礎上,形成了安全執行環境。
4、Rockchip 平臺的 Trust
首先,如何理解 Trust 呢? Trust 是一套安全機制和軟件實現,它基于 ARM TrustZone 的硬件隔離特性,將系統劃分為安全世界和非安全世界,也就是上面提到的那些內容。因此,在討論 Rockchip 平臺的 Trust 時,實際上就是在討論 Rockchip 對安全世界的實現及管理方式。
4.1、實現機制
目前 Rockchip 平臺上的 64 位 SoC 平臺上使用的是 ARM Trusted Firmware + OP-TEE OS 的組合;32位 SoC 平臺上使用的是 OP-TEE OS。
4.2、啟動流程
ARM Trusted Firmware 的體系架構里將整個系統分成四種安全等級,分別為:EL0、EL1、EL2、EL3。將整個安全啟動的流程階段定義為:BL1、BL2、BL31、BL32、BL33,其中 ARM Trusted Firmware 自身的源代碼里提供了 BL1、BL2、BL31 的功能。Rockchip 平臺僅使用了其中的 BL31 的功能,BL1 和 BL2 是rk自己實現的一套方案。所以在 Rockchip 平臺上我們一般也可以“ 默認” ARM Trusted Firmware 指的就是 BL31,而 BL32 使用的則是 OP-TEE OS。
如果把上述這種階段定義映射到 Rockchip 的平臺各級固件上,對應關系為:Maskrom(BL1)、Loader (BL2)、Trust(BL31:ARM Trusted Firmware + BL32:OP-TEE OS)、U-Boot(BL33)。
固件啟動順序:
Maskrom -> Loader -> Trust -> U-Boot -> kernel
4.3、生命周期
Trust 自上電初始化之后就始終常駐于內存之中,完成著自己的使命。
4.4、Trust 編譯打包流程分析
rk提供了閉源的BL31(ATF)、BL32(OP-TEE),位于:
# BL31
<sdk>/rkbin/bin/rk35/rk3568_bl31_v1.44.elf
# BL32
<sdk>/rkbin/bin/rk35/rk3568_bl32_v2.11.bin
由<sdk>/rkbin/RKTRUST/RK3568TRUST.ini
指定,uboot編譯過程中會用到該文件:
目前,rk uboot鏡像默認打包方式走的是FIT(Flattened Image Tree)
,即根據.its
文件打包成.itb
。
its文件位于:
<sdk>/u-boot/fit/u-boot.its
/** Copyright (C) 2020 Rockchip Electronic Co.,Ltd** Simple U-boot fit source file containing ATF/OP-TEE/U-Boot/dtb/MCU*//dts-v1/;/ {description = "FIT Image with ATF/OP-TEE/U-Boot/MCU";#address-cells = <1>;images {uboot {description = "U-Boot";data = /incbin/("u-boot-nodtb.bin");type = "standalone";arch = "arm64";os = "U-Boot";compression = "none";load = <0x00a00000>;hash {algo = "sha256";};};atf-1 {description = "ARM Trusted Firmware";data = /incbin/("./bl31_0x00040000.bin");type = "firmware";arch = "arm64";os = "arm-trusted-firmware";compression = "none";load = <0x00040000>;hash {algo = "sha256";};};atf-2 {description = "ARM Trusted Firmware";data = /incbin/("./bl31_0xfdcc1000.bin");type = "firmware";arch = "arm64";os = "arm-trusted-firmware";compression = "none";load = <0xfdcc1000>;hash {algo = "sha256";};};atf-3 {description = "ARM Trusted Firmware";data = /incbin/("./bl31_0x0006b000.bin");type = "firmware";arch = "arm64";os = "arm-trusted-firmware";compression = "none";load = <0x0006b000>;hash {algo = "sha256";};};atf-4 {description = "ARM Trusted Firmware";data = /incbin/("./bl31_0xfdcd0000.bin");type = "firmware";arch = "arm64";os = "arm-trusted-firmware";compression = "none";load = <0xfdcd0000>;hash {algo = "sha256";};};atf-5 {description = "ARM Trusted Firmware";data = /incbin/("./bl31_0xfdcce000.bin");type = "firmware";arch = "arm64";os = "arm-trusted-firmware";compression = "none";load = <0xfdcce000>;hash {algo = "sha256";};};atf-6 {description = "ARM Trusted Firmware";data = /incbin/("./bl31_0x00069000.bin");type = "firmware";arch = "arm64";os = "arm-trusted-firmware";compression = "none";load = <0x00069000>;hash {algo = "sha256";};};optee {description = "OP-TEE";data = /incbin/("tee.bin");type = "firmware";arch = "arm64";os = "op-tee";compression = "none";load = <0x8400000>;hash {algo = "sha256";};};fdt {description = "U-Boot dtb";data = /incbin/("./u-boot.dtb");type = "flat_dt";arch = "arm64";compression = "none";hash {algo = "sha256";};};};configurations {default = "conf";conf {description = "rk3568-evb";rollback-index = <0x0>;firmware = "atf-1";loadables = "uboot", "atf-2", "atf-3", "atf-4", "atf-5", "atf-6", "optee";fdt = "fdt";signature {algo = "sha256,rsa2048";key-name-hint = "dev";sign-images = "fdt", "firmware", "loadables";};};};
};
最后將構建出的u-boot.itb生成成uboot.img:
u-boot.its -> u-boot.itb -> uboot.img
整個uboot的編譯涉及的編譯腳本如下,可自行分析:
<sdl>/u-boot/make.sh
<sdk>/u-boot/scripts/fit.sh
關于uboot鏡像的打包方式在uboot menuconfig中有如下宏開關進行選擇:
# FIT打包。默認開啟。最后生成uboot.img和loader.bin,其中uboot.img已經包括了ATF和OPTEE
CONFIG_ROCKCHIP_FIT_IMAGE_PACK=y
# DECOMP打包。
CONFIG_SPL_DECOMP_HEADER=n
# 若以上兩個選項都不啟用,最后生成uboot.img、trust.img、loader.bin。即把trust.img獨立了出來。
5、總結
TrustZone 提供了系統運行時的可信執行環境,使得開發者可以保護敏感數據和關鍵操作。理解 Trust 的存在與作用,有助于開發更安全的應用,也讓對芯片安全特性的理解更加完整。
參考文章:
https://zhuanlan.zhihu.com/p/23529470235
rk3568安全啟動功能實踐_rk3568 安全啟動-CSDN博客