因为漏洞数量随着连接设备数量的增长而增长,安全性变得越来越重要。 Arm多年来一直将安全性放在第一位并在2003年推出安全硬件架构TrustZone®。TrustZone的一项主要功能可将系统级硬件隔离到到两个世界:Secure和Non-secure(正常)世界。 可以通过安全配置寄存器(SCR)将处理单元(PE)配置为以上两种状态之一。
传统应用程序,通用操作系统(Operating Systems(OS))和虚拟机监视器(Virtual Machine Monitors (VMM))在Non-secure世界中的富执行环境(Rich Execution Environment (REE))中运行。相比之下,可信执行环境(Trusted Execution Environment (TEE))可以托管在Secure世界中,这里提供了由一个或多个可信操作系统(Trusted OS)管理的服务,例如安全引导(Secure Boot),凭据验证,数字版权管理(DRM)或加密。重要的是要指出,REE软件故障和不当行为是不会影响TEE的。
TrustZone的核心是安全监控(Secure Monitor (SM)),它提供了REE和TEE之间的上下文切换,同时处理了安全监视器调用(Secure Monitor Calls(SMC))。SMC构成了世界之间的通信和服务提供。Armv8为SM的运行提供了新的架构异常级别 EL3。Arm提供了被称为可信固件(Trusted Firmware(TF))的Secure世界的软件实现参考,其中包括SM的实现。 这篇文章简要介绍了TF,gem5模拟器,gem5支持TF的动机及其未来的功能。
Trusted Firmware-A
可信固件-A(Trusted Firmware-A(TF-A))是Arm针对A系列架构的Secure世界的软件实现参考。它支持Secure Boot流程模型,并为在异常级别 3 (EL3)上执行的SM以及几个Arm低级别软件接口标准提供实现方法,其中包括以下几点:
• Secure世界PE和其他Arm IP的初始化
• 用于访问系统控制处理器(System Control Processors (SCP) )的系统控制和管理接口(System Control and Management Interface (SCMI))的驱动程序
• 支持电源管理的电源状态协调接口(Power State Coordination Interface (PSCI))库
• SMC处理
- 用于多个Trusted OS(例如OP-TEE和Android Trusty TEE)安全的负载分配器(Secure Payload Dispatchers(SPD))。
• 固件更新
TF-A支持基于硬件信任根的Secure Boot流程模型。Boot过程分为多个连续的boot阶段,其中每个阶段都会验证下个阶段的签名;初始阶段通常被托管在ROM中。 以下阶段被特别定义:
• BL1:可信 ROM (Trusted ROM)
• BL2:可信引导固件(Trusted Boot Firmware)
• BL31:EL3运行时间软件 (EL3 Runtime Software)
• BL32:安全的EL1-有效载荷(Secure EL1-Payload)
• BL33:不可信固件(Non-trusted Firmware)
BL33可能是传统的bootloader涵盖UEFI的实现方法,例如Das U-boot或TianoCore EDK II,它们不是TF-A的一部分。 这些阶段可以被打包在一个称为固件映像包(FIP)的二进制文件中,之后可以加载到平台中去。
图1:TF boot步骤
gem5
gem5是一个用于计算机架构研究的事件驱动系统模拟器,广泛用于学术界,工业界以及Arm内部; 我们有团队正积极维护和改善仿真器的上游分布。
基于对仿真速度和精确性的权衡,有多种可行的建模解决方案:松散时序(Loosely Timed(LT))解决方案(如QEMU 或 Arm Fast Models)可以为软件开发、验证和集成等用例提供高仿真速度的环境。时钟精确(Cycle Accurate(CA))解决方案(如RTL仿真或Arm Cycle Models)包括精细的IP调优、基准测试和选择。gem5是一个近似时序( Approximately Timed(AT))解决方案,它涵盖了早期系统级解决方案的性能和功耗探索。
图2:建模解决方案图
gem5可以在完整系统模式(Full System Mode)下运行实际存在的软件,例如upstreamLinux Kernelgem5同时可以通过Syscall仿真模式(Syscall Emulation Mode)支持更快的仿真,其中模拟器自身提供内核服务,类似于QEMU用户空间仿真。模型参数可以在仿真设计时进行微调来适应基于不同特定微架构或硬件世代的用例。
Gem5中的TF-A支持
动机
以下列举了gem5添加对TF-A支持的动机:
• 性能/功耗探索和早期原型的制作:
- Secure Boot流程模型
- EL3运行时的实现
- 安全操作系统(Secure OSs)
- 现有和新的SMC调用
- 功耗管理
• Arm平台中基于UEFI的boot流程兼容性
- 向Arm支持Windows 系统迈进
起点
TF-A包含对多平台的支持,每个平台有不同的托管硬件组件集(例如PE,外围设备,存储设备),以及它们在其内存映射中的位置。
Arm提供了一组在Fast Models上开发的固定虚拟平台(Fixed Virtual Platforms(FVP))参考。 BasePlatform是FVP的基础并免费提供给针对Arm产品软件开发的客户进行实验和开发。被称作Foundation的BasePlatform最低版本也免费提供,它是启用Arm平台的最简单解决方案。 TF-A对BasePlatform和Foundation都有官方支持。
gem5还提供了一组基于Versatile Express RS1平台的Arm参考平台(VExpress\_GEM5\_Base系列)略微修改了内存映射来适应gem5特定的外围设备。 这里有两种变化形式:VExpress\_GEM5\_V1和VExpress\_GEM5\_V2,后者提供了GICv3模型。 不幸的是,VExpress\_GEM5\_Base没有对TF-A的支持。
方法
最初有三种方法被考虑:
1.在TF-A中通过移植Foundation的支持添加对VExpress\_GEM5\_V2的支持
2.修改VExpress\_GEM5\_V2与Foundation兼容
3.在gem5中添加对Foundation平台的支持
第一种方法建立了参考平台VExpress\_GEM5\_V2。 这意味着固件开发人员将不得不在Foundation和VExpress\_GEM5\_V2两个互不兼容的目标平台之间进行选择。
第二种方法涉及重组VExpress\_GEM5\_V2中现有的模型(例如GICv3)以及添加缺失的模型(例如额外的UART和SP805)来适应Foundation的内存映射。 尽管这是可行的,但这会破坏现有VExpress\_GEM5\_V2用户的向后兼容性。
第三种方法提供了一条统一gem5和Fast Models参考平台的途径,除了可以避免先前的缺点外,还产生了结论中所述的其他好处。
研究亮点
上述决定为gem5做出了以下贡献:
• 新的VExpress\_GEM5\_Foundation平台模型支持Foundation未经修改的TF-A的实现。
- 新的FVPBasePwrCtrl电源控制器模型可启用VExpress\_GEM5\_Foundation,包括通过PSCI的多处理器配置支持。
- 适用于Secure 和Non-secure世界看门狗的新型SP805型号。
• 新的Arm Trusted Firmware工作负载模型在仿真设计时帮助BL1和FIP加载到物理内存中。
为了测试这些优点,我们成功建立了一个系统,其中TF-A将上游Das U-boot加载为BL33,而后者将上游Linux kernel加载为Non-trusted EL1-Payload。在此仿真中,我们运行了官方的TF-A测试来强调EL3服务。基本的框架验证测试以及主要的PSCI服务(包括PE暂停和恢复,PE热插拔和相似性信息)均获得成功。我们还将OP-TEE OS称为Secure EL1-Payload,但是尚未对此进行进一步测试。
以下是项目工作产生使gem产生的额外优点:
• GenericTimer模型已经重新设计并添加了包括对生成内存映射计时器,多计时器帧和Event Stream的支持。
• 添加对GICv3 WakeRequest的支持能够通过FVPBasePwrCtrl启用电源管理
• 改进了Das U-Boot加载Linux内核所需的半主机
使用指南
本节介绍了在gem5中boot基于TF-a仿真的分步指南。请遵循建议所给的顺序,因为有些构建步骤需要在之前的步骤中获取工件。
在开始之前, 请确保满足每个软件工件的构建需求并在Ubuntu 20.04上通过测试。
获取并构建软件
创建一个目录来存储生成构建输出:
mkdir -p resources/binaries resources/disks resources/semihosting
gem5 (模拟器)
-b v20.0.0.1
cd gem5/
scons -j $(nproc) build/ARM/gem5.opt
cd -
make -C gem5/util/term
Linux (Non-trusted EL1-Payload)
-b v5.4
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -C linux defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -C linux -j $(nproc)
mv linux/arch/arm64/boot/Image resources/semihosting/
Das U-Boot (BL33)
-b v2020.07-rc3
make CROSS_COMPILE=aarch64-linux-gnu- -C u-boot vexpress_aemv8a_semi_defconfig
使用默认FVP配置和以下参数:
make CROSS_COMPILE=aarch64-linux-gnu- -C u-boot menuconfig
• 延迟几秒后自动boot-> 0
- 跳过等待时间以auto-booting。 注意:您可以将其保留为1,然后在等待期间按任意键进入U-Boot shell进行手动boot。 对shell的访问已经过测试,但是不能手动boot。
• Boot参数
- 删除“debug user\_debug=31 loglevel=9”
- 附加“ root=/dev/vda rw norandmaps”
• 环境(Environment)
- Environment is not stored -> Enabled
- Environment in flash memory -> Disabled
不支持闪存
• Networking Support -> Disabled
- Foundation平台不支持以太网控制器,因此我们禁用网络支持来避免访问崩溃
make CROSS_COMPILE=aarch64-linux-gnu- -C u-boot -j $(nproc)
mv u-boot/u-boot.bin resources/binaries/
Trusted Firmware-A (BL1, BL2, BL31)
-b v2.3
make CROSS_COMPILE=aarch64-linux-gnu- \
PLAT=fvp \
BL33=../resources/binaries/u-boot.bin \
-C trusted-firmware-a all fip
mv trusted-firmware-a/build/fvp/release/bl1.bin resources/binaries/
mv trusted-firmware-a/build/fvp/release/fip.bin resources/binaries/
注意:可以通过将DEBUG = 1和LOG\_LEVEL = 50传递给build命令构建TF-A的调试版本。 然后可以检查gem5的终端输出逐步查看TF-A boot过程。
Buildroot (最小 root filesystem)
-b 2020.05-rc3
make ARCH=aarch64 BR2_JLEVEL=$(nproc) CROSS_COMPILE=aarch64-linux-gnu- \
-C buildroot/ arm_foundationv8_defconfig
使用默认的Foundation配置和以下参数值
make ARCH=aarch64 BR2_JLEVEL=$(nproc) CROSS_COMPILE=aarch64-linux-gnu- \
-C buildroot/ menuconfig
• 目标选项(Target Options)
- Target Architecture Variant -> cortex-A57
• 工具链(Toolchain)
- Kernel Headers -> Manually specified Linux version
- linux version -> 5.4
- Custom kernel headers series -> 5.4.x or later
• Kernel -> Disabled
- 我们在外部构建Linux内核。
• 目标包装(Target packages)
- 使用BusyBox配置文件?
package/busybox/busybox-minimal.config
- 网络应用(Networking applications)
ifupdown scripts -> Disabled
我们不支持联网。
make ARCH=aarch64 BR2_JLEVEL=$(nproc) CROSS_COMPILE=aarch64-linux-gnu- \
-C buildroot/
mv buildroot/output/images/rootfs.ext2 resources/disks/
Device Tree Blob (DTB)
使用gem5 auto-DTB来生成:
export M5_PATH=resources/ && \
gem5/build/ARM/gem5.opt gem5/configs/example/arm/baremetal.py \
--workload ArmTrustedFirmware \
--disk-image resources/disks/rootfs.ext2 \
--num-cores 4 \
--machine-type VExpress_GEM5_Foundation \
--dtb-gen \
--semi-enable --semi-path resources/semihosting/
mv m5out/system.dtb resources/semihosting/devtree.dtb
注意:1-4核的配置均支持
仿真运行及连接
在继续之前,请检查您的资源目录是否如下所示:
resources
binaries
bl1.bin
fip.bin
u-boot.bin
disks
rootfs.ext2
semihosting
Image
devtree.dtb
现在可以运行仿真:
export M5_PATH=resources/ && \
gem5/build/ARM/gem5.opt gem5/configs/example/arm/baremetal.py \
--workload ArmTrustedFirmware \
--disk-image resources/disks/rootfs.ext2 \
--num-cores 4 \
--machine-type VExpress_GEM5_Foundation \
--semi-enable --semi-path resources/semihosting/
并连接到此:
gem5/util/term/m5term 3456
现在应该可以看到不同的bootloader阶段,最后是Linux kernel的boot过程。 完成后,root filesystem提供的shell登录信息将被显示。 输入“ root”作为用户名获得访问权限。
结论与后续步骤
通过在gem5中提供Foundation模型,我们不仅继承了TF-A支持,还可以继承现有或将来的任何Fast Models Foundation的软件支持。 这使Arm客户可以在开发过程中轻松地集成Fast Models和gem5,从而对系统级性能和解决方案功能进行推理。
最初的TF-A支持已与2020年的第一个gem5的主要版本v20.0.0.0一起发布。 该项目已开发了gem5支持TF-A的必要功能,但是仍需要对这些功能进行大量的测试来进行全面验证。
TF-A提供了自己独有的Secure EL1-Payload测试,这将有助于压力分配器和SMC处理。 除OP-TEE操作系统以外的EL1-Payload(例如Android Trusty TEE)也应进行测试。 应当用官方的TF-A测试来验证其他功能,包括固件更新和SCMI。 我们期待gem5社区可以随着人们对gem5兴趣的增加而加强对gem5的支持。 如有任何疑问,请与我或Giacomo Travaglini联络。
作者:Adrian Herrera
翻译:Khorina
原文链接:https://community.arm.com/developer/research/b/articles/posts/running-trusted-firmware-a-on-gem5