【第二部分:结构】ARM Realm Management Monitor specification

目录

概念

本章介绍了以下是RMM体系结构的核心概念:

Realm

本节描述了一个Realm的概念。

概述

Realm是一种执行环境,它不受非安全和安全安全状态下的代理和其他Realm的影响。

Realm执行环境

Realm的执行环境是EL0 + EL1环境,如a型文件架构[3]的《ARM架构参考手册》中所述。

Realm寄存器

在第一次进入Realm VPE时,PE状态根据A形架构参考手册[3]中的"重置为AArch64状态"初始化,但主机在Realm创建过程中指定的GPR和PC值除外。

保证了一个Realm VPE的通用用途和SIMD /浮点寄存器的保密性。

保证了其他Realm VPE寄存器状态(包括堆栈指针、程序计数器和EL0 / EL1系统寄存器)的保密性。

这保证了一个Realm VPE的通用用途和SIMD /浮点寄存器的完整性。

保证了其他Realm VPE寄存器状态(包括堆栈指针、程序计数器和EL0 / EL1系统寄存器)的完整性。

Realm可以使用主机调用向主机传递参数,并接收来自主机的结果。

Realm内存

一个Realm能够确定一个给定的IPA是受到保护还是不受保护。

通过受保护地址访问的内存内容保证机密性。非正式地说,这意味着CCA平台之外的任何代理都无法观察到该内存位置内容的更改。

这保证了通过一个受保护的地址访问的内存内容的完整性。非正式地说,这意味着该Realm不遵守要更改的位置的内容,除非该Realm本身对该位置写了不同的值,或同意RMM要求违反该位置的完整性。

Realm处理器功能

从读取特性寄存器返回到一个Realm的值在架构上是有效的,它描述了在该Realm的执行环境中存在的一组特性。

如果将底层硬件平台支持的特性暴露导致安全漏洞,则RMM可能会抑制底层硬件平台支持的特性。

IMPDEF系统寄存器

从实现定义的系统寄存器中读取或写入的Realm会导致该Realm发生未知异常。

Realm属性

本节描述了一个Realm的属性。

Realm属性是一个Realm的一个属性,它可以通过主机或Realm来观察或修改其值。

Realm属性的一个示例是RMM命令的结果。

在下表中总结了一个Realm的属性。

Realm初始测量(RIM)是在激活时对Realm的配置和内容的测量。

Realm可扩展测量(REM)是一个在Realm的生命周期内可以扩展的测量值。

一个Realm的属性包括一个测量值的数组。这个数组中的第一个条目是一个RIM。这个数组中的其余条目是REMs。

在领域创建过程中,主机提供ipa_width、rtt_level_start和rtt_num_start值作为Realm参数。根据VMSA,rtt_num_start值在架构上被定义为ipa_width值和rtt_level_start值的函数。因此,可以设计领域创建界面,使主机只提供了ipa_width值和rtt_level_start值。但是,这可能会允许成功地创建一个Realm,但其配置与主机的意图不匹配。因此,我们决定,主机应该显式地指定所有三个值,如果值不一致,Realm创建将失败。详情请参见A-配置文件体系结构[3]的ARM体系结构参考手册。

一个Realm的VMID值由主机选择。VMID必须在硬件平台支持的范围内。RMM确保系统上的每个Realm都有一个唯一的VMID。

Realm个性化值(RPV)是由主机提供的,用于区分具有相同Realm初始度量,但行为不同的Realm。

RPV的可能用途包括:

A GUID

Realm所有者的哈希值为公钥

"个性化文件"的散列,通过侧带(例如,通过NS内存)提供给Realm,并包含Realm软件使用的配置信息。

RMM将RPV视为一个不透明的值。

RPV作为一个单独的声明被包括在该Realm的认证报告中。

Realm活性

Realm活性是一种属性,它意味着存在一个或多个颗粒,除了RD和起始级RTTs,它们属于Realm。

如果一个Realm是活的,它就不能被摧毁。

如果存在以下任何一项,则一个Realm是有效的:

该Realm所拥有的RECs数量不为零

该Realm的起始级别RTT是实时的

如果一个Realm拥有非零数量的数据颗粒,这意味着它有一个起始级别的RTT,它是活的,因此该领域本身是活的。

Realm生命周期

状态

一个Realm的状态列出如下。

NEW 正在建设中。不符合执行资格。

ACTIVE 符合执行条件。

SYSTEM_OFF 系统已被关闭。不符合执行资格。

状态转换

允许的Realm状态转换如下表所示。最右边的列列出了可能导致相应状态转换的事件。

从伪状态NULL进行的转换表示Realm对象的创建。向伪状态NULL的转换表示对Realm对象的破坏。

允许的Realm状态转换如下图所示。每个圆弧都标记有可能导致相应状态转换的事件

从伪状态NULL进行的转换表示RD的创建。向伪状态NULL的转换表示RD的破坏。

Realm参数

Realm参数是主机在Realm创建过程中提供的值。

Realm描述符

Realm描述符(RD)是一种存储Realm属性的RMM数据结构。

一个RD的大小是一个颗粒Granule。

颗粒Granule

本节描述了颗粒体的概念。

颗粒存储器是一个大小为4KB的物理内存单位。

颗粒可用于储存以下颗粒之一:

主机使用的代码或数据

处于安全安全状态的软件使用的代码或数据

一个Realm所使用的代码或数据

RMM用于管理一个Realm的数据

颗粒的使用反映在其生命周期状态中。

如果颗粒可以由主机委托给RMM或领域使用,那么它是可委托的。

在典型的实现中,以RAM形式呈现给主机的所有内存都是可委托的。不可委托内存的示例可能包括:

为根世界、RMM或安全世界使用的内存

设备内存

颗粒属性

本节将介绍颗粒体的属性。

颗粒属性是颗粒的一个属性,其值可以被主机或领域观察或修改

可观察到的颗粒属性的方法的示例包括RMM命令的结果,以及内存访问是否产生故障。

下表中总结了一个颗粒体的属性。

物理地址空间集为:NS, REALM, OTHER

RMM不能区分一个颗粒是在安全PAS中还是在根PAS中,所以这两个值被合并为OTHER。

如果颗粒的状态不是未授权UNDELEGATED的,那么颗粒的PAS就是REALM

如果颗粒的状态未被授权UNDELEGATED,那么颗粒的PAS就不是REALM

如果一个颗粒的状态未被委托UNDELEGATED,那么RMM并不会阻止该颗粒的PAS被另一个代理更改为除REALM以外的任何值。

NS颗粒是一种PAS为NS的颗粒。

颗粒所有权

既不未授权也不授权的颗粒属于Realm所有。

颗粒的所有者由Realm描述符(RD)的地址标识。

对于状态为RD的颗粒,所有权关系是递归的:拥有Realm由RD本身的地址标识。

状态为RTT的颗粒是以下情况之一:

一个起始水平的RTT。此RTT的地址存储在所拥有Realm的RD中。

一个非启动水平的RTT。此RTT的地址存储在其父RTT中,并存储在一个状态为表的RTT条目中。递归地遵循父关系,导致了拥有Realm的RD。

一个状态为DATA的颗粒被映射到一个受保护的IPA上,在一个状态被分配的RTT条目中。拥有RTT的Realm是数据颗粒的所有者。

REC具有一个"所有者"属性,该属性指向拥有Realm的RD。

REC没有映射到受保护的IPA上。因此,需要明确地记录它的所有权

颗粒生命周期

状态

一个颗粒的状态列出如下。

状态转换

允许的颗粒状态转换如下表所示。最右边的列列出了可能导致相应状态转换的事件。

允许的颗粒状态转变如下图所示。每个圆弧都标记有可能导致相应状态转换的事件。

颗粒抹除

当颗粒的状态从P过渡到委托状态DELEGATED,然后过渡到任何其他状态时,任何与P相关的内容都已被删除。

通过委托状态DELEGATED的任何颗粒状态转换序列都会导致颗粒内容被删除。这是必要的,以确保信息不会从一个Realm泄漏到另一个Realm,或从一个Realm泄漏到主机。请注意,在委托颗粒的状态DELEGATED时,任何代理都不能观察颗粒的内容。

擦除是一种将内存位置的可观测值从X改变为Y的操作,使得不能从值Y确定值X的操作。

擦除内存位置并不会直接或间接地显示任何机密的领域数据。

不保证擦拭可以被实现为零填充。

Realm软件不应该假设未初始化的内存(即,由使用RMI_DATA_CREATE_UNKNOWN创建的数据颗粒支持的Realm IPA空间)的初始内容为零。

Realm执行上下文

本节介绍了Realm执行上下文(REC)的概念。

概述

Realm执行上下文(REC)是一个与领域VPE相关联的R-EL0和1执行上下文。

REC对象是一种RMM数据结构,它是用来存储REC的寄存器状态的

REC属性

本节将介绍REC的属性。

REC属性是REC的一个属性,其值可以由主机或拥有REC的Realm域来观察或修改。

可以观察到REC属性的方法的示例包括RMM命令的结果和Realm条目之后的PE状态

下表中总结了REC的属性。

REC的aux属性是一个辅助颗粒的列表。

REC所需的辅助颗粒数由RMI_REC_AUX_COUNT命令返回。

根据CCA平台和Realm的配置,REC所需的存储空间量可能超过单个颗粒。

REC所需的辅助颗粒数量在CCA平台上的Realm之间有所不同。

REC所需的辅助颗粒的数量是一个给定Realm的生命周期内的一个常数

REC的gprs属性是一组通用寄存器值,在退出REC时由RMM保存,在进入REC时由RMM恢复。

REC的mpidr属性是一个可用于识别与REC关联的VPE的值。

REC的pc属性是程序计数器,它在退出REC时由RMM保存,在进入REC时由RMM恢复。

REC的可运行标志决定了REC是否适合执行。只有当标志的值可运行时RUNNABLE,RMI_REC_ENTER命令才会导致REC条目。

REC的可运行标志由该Realm控制。它的初始值反映在Realm的初始测量中,在Realm执行期间,它的值可以通过执行PSCI_CPU_ON和PSCI_CPU_OFF命令来改变

REC的状态属性由主机通过执行RMI_REC_ENTER命令来控制。

REC的sysregs属性是一组系统寄存器值,这些值在从REC退出时由RMM保存,在进入REC时由RMM恢复。

REC指数和MPIDR值

REC索引是由MPIDR字段串联生成的无符号整数值:

index = Aff3:Aff2:Aff1:Aff0[3:0]

这一点如下表所示。


REC MPIDR值的Aff0[7:4]是RES0字段,以便与GICv3兼容。

当在一个Realm中创建第n个REC时,主机需要使用与REC索引n对应的MPIDR。

REC生命周期

状态
状态转换

允许的REC状态转换如下表所示。最右边的列列出了可能导致相应状态转换的事件。

从伪状态NULL进行的转换表示REC对象的创建。向伪状态NULL的转换表示对REC对象的破坏。

允许的REC状态转换如下图所示。每个圆弧都标记有可能导致相应状态转换的事件。

从伪状态NULL进行的转换表示REC的创建。向伪状态NULL的转换表示REC的破坏。

参考文献

[1] Introducing Arm CCA. (ARM DEN 0125) Arm Limited.

[2] Arm Architecture Reference Manual Supplement, The Realm Management Extension (RME), for Armv9-A.

(ARM DDI 0615 A.d) Arm Ltd.

[3] Arm Architecture Reference Manual for A-Profile architecture. (ARM DDI 0487 I.a) Arm Ltd.

[4] Arm CCA Security model. (ARM DEN 0096) Arm Limited.

[5] Arm Generic Interrupt Controller (GIC) Architecture Specification version 3 and version 4. (ARM IHI 0069

G) Arm Ltd.

[6] Concise Binary Object Representation (CBOR).

[7] CBOR Object Signing and Encryption (COSE).

[8] Entity Attestation Token (EAT).

[9] Concise Data Definition Language (CDDL).

[10] IANA Hash Function Textual Names.

[11] SEC 1: Elliptic Curve Cryptography, version 2.0.

[12] RME system architecture spec. (ARM DEN 0129) Arm Ltd.

[13] Arm SMC Calling Convention. (ARM DEN 0028 D) Arm Ltd.

[14] Arm Specification Language Reference Manual. (ARM DDI 0612) Arm Ltd.

[15] Secure Hash Standard (SHS).

[16] Arm Power State Coordination Interface (PSCI). (ARM DEN 0022 D.b) Arm Ltd.

相关推荐
韦德斯1 天前
嵌入式Linux的RTC读写操作应用
linux·运维·c语言·arm开发·实时音视频
byte轻骑兵1 天前
嵌入式 ARM Linux 系统构成全解:从硬件到应用层层剖析
linux·arm开发·arm·嵌入式开发
思尔芯S2C1 天前
面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案
arm开发·架构·汽车·iot·fpga原型验证·prototyping·智慧视觉
Eternal-Student2 天前
【docker了解】如何将x86镜像转换为适用于Jetson的ARM镜像
arm开发·docker·容器
不怕犯错,就怕不做2 天前
修复kernel编译栈帧大小异常问题error: the frame size of 1928 bytes is larger than 1024 bytes
linux·arm开发·驱动开发
憧憬一下3 天前
UART硬件介绍
arm开发·嵌入式硬件·串口·嵌入式·linux驱动开发
Petal9909124 天前
UEFI学习笔记(十八):ARM电源管理之PSCI和SCMI概述
arm开发·笔记·学习·uefi
古月居GYH4 天前
一文了解ARM内部架构
arm开发·架构
白书宇4 天前
13.100ASK_T113-PRO RTC实验
linux·arm开发·驱动开发·嵌入式硬件·物联网·硬件工程
简简单单一天吃六顿5 天前
rootfs根文件系统在Linux下制作动态库
linux·服务器·arm开发·iot