5.安全分区的运行时模型

本节介绍了安全分区如何与SPM接口。

5.1. 与SPM的接口

为了在S-EL0中的安全分区中实例化一个或多个安全的服务,SPM应定义以下类型的接口:

可以从S-EL0访问特权操作的接口。 这些操作通常需要访问安全世界中多个软件组件之间共享的系统资源,或者无法从非特权异常级别直接访问。

接口在SPM和安全分区之间建立控制路径。

本节介绍了SPM当前导出的API,该API可以使安全分区本身初始化并在S-EL0中导出其服务。 这些接口无法从非安全世界访问。

5.1.1.导管

SMC调用公约(ARM DEN 0028B)规范描述了用于访问固件服务及其可用性的SMC和HVC导管,具体取决于实现的异常级别。 在S-EL0中,主管呼叫异常(SVC)是唯一可用于无私人软件的架构机制,可以要求在特权软件中实施的操作。 因此,安全分区必须使用SVC导管来访问SPM实现的接口。

SVC会导致S-EL1的例外。 TF-A假定S-EL1的所有权,并在S-EL1中安装了一个简单的异常矢量表,该表将SVC请求从安全分区中传输为SMC请求,作为SMC请求到EL3中的SPM。 在为SMC请求提供服务后,可信赖的固件 - 通过ERET指令将控制直接返回到S-EL0。

5.1.2. 调用公约

SMC呼叫公约(ARM DEN 0028B)规范描述了SMC和HVC导管的32位和64位呼叫约定。 SVC导管介绍了SVC32和SVC64调用约定的概念。 SVC32和SVC64调用约定分别等同于32位(SMC32)和64位(SMC64)呼叫约定。

5.1.3. SPM发起的沟通

SPM通过异常返回指令(ERET)启动服务请求。 后来,安全分区发布了SVC指令,以发出请求的完成。 下面给出了一些示例用例:

在系统引导过程中初始化安全分区的请求。

处理运行时服务请求的请求。

5.1.4. 安全分区发起的沟通

通过执行SVC指令从安全分区启动请求。 TF-A使用ERET指令返回S-EL0,结果是该请求的结果。

例如,代表分区执行特权操作的请求(例如,安全的EL1&0转换制度的转换表中的内存属性管理)。

5.1.5.接口

当前的实现储备金为标准安全服务呼叫范围(请参阅SPM导出的API)中的标准安全服务呼叫范围(请参阅SMC呼叫常规(ARM DEN 0028B)规范)的功能ID。 本节定义了每个函数ID的功能原型。 函数ID指定SVC32和SVC64通话约定是否可以用于调用相应的接口。

5.1.6.安全分区事件管理

安全分区提供了一个事件管理接口,SPM使用该界面将服务请求委派给安全分区。 该界面还允许安全分区:

向SPM注册它提供的服务。

表示完成SPM授权的服务请求

5.2. 其他界面

5.2.1. SPM_MM_VERSION_AARCH32

  • 描述

    返回SPM导出的接口的版本。

  • 参数

    UINT32-功能ID

      SVC32版本:0x84000060
    
  • 返回参数

    INT32-状态

    关于成功,该值的格式如下:

      位[31]:必须是0位[30:16]:主要版本。 对于SPM接口的此修订,必须为0。位[15:0]:次要版本。 对于SPM接口的此修订,必须为1。错误,该值的格式如下:NOT_SUPPORTED:不支持SPM接口或不支持客户端。
    
  • 用法

    此功能返回安全分区管理器实现的版本。 主要版本为0,次要版本为1。版本编号是31位未签名的整数,上部15位表示主要修订版,而下部16位表示次要修订版。 以下规则适用于版本编号:

    • 不同的主要修订值表明可能不兼容的功能。

    • 对于两个修订版,A和B,对于主要的修订值是相同的,如果修订B的次要修订值大于修订a的次要修订值,则修订版中的每个函数a必须以兼容的方式与修订 B.但是,修订B的功能计数可能比修订。

  • 实施职责

    如果此功能返回有效的版本号,则必须实现所有描述的所有功能,除非明确说明函数是可选的。

请参阅与每个返回代码关联的整数值的错误代码。

5.3 安全分区初始化

SPM负责初始化体系结构执行上下文,以便在S-EL0中对服务的初始化。 SPM的职责如下列出。 在初始化结束时,该分区发布MM_SP_EVENT_COMPLETE_AARCH64调用(后面描述)以发出准备就绪的准备就绪,以处理安全分区实施的服务请求。 初始化事件被执行为快速调用。

5.3.1. 入口点调用

应将其作为快速呼叫的服务请求的入口点用作ERET指令的目标,以开始对安全分区的初始化。

5.3.2. 架构设置

在Cold Boot,除非另有说明,否则可从S-EL0访问的系统寄存器将处于重置状态。 SPM将执行以下架构设置,以在S-EL0中执行执行

5.3.3. MMU设置

安全分区的平台端口为SPM指定了它需要访问的区域列表及其属性。 SPM验证了此资源描述,并以如下的方式初始化了安全的EL1和0翻译制度。

  • 设备区域用NGNRE属性映射,并执行永无止境的访问权限。

  • 代码内存区域用RO数据和可执行指令访问权限映射。

  • 读取仅使用RO数据映射数据存储区域,并执行永不指导访问权限。

  • 读写数据记忆区域是用RW数据映射的,并执行“永不指示访问权限”。

  • 如果资源描述未明确描述内存区域的类型,则所有内存区域都将用代码内存区域属性标记。

  • UXN和PXN位设置为无法由S-EL0或S-EL1执行的区域。

5.3.4. 系统寄存器设置

SPM设置了影响软件执行的系统寄存器,如下所示:

  • SCTLR_EL1

    UCI=1

    EOE=0

    WXN=1

    nTWE=1

    nTWI=1

    UCT=1

    DZE=1

    I=1

    UMA=0

    SA0=1

    C=1

    A=1

    M=1

  • CPACR_EL1

    FPEN=b’11

  • PSTATE

    D,A,I,F=1

    CurrentEL=0 (EL0)

    SpSel=0 (Thread mode)

    NRW=0 (AArch64)

5.3.5. 通用寄存器设置

SPM将通过执行ERET指令来调用服务的入口点。 该向S-EL0的过渡是特殊的,因为它不是通过SVC指令响应先前的请求的。 这是S-EL0的第一个条目。 进入时的通用注册使用情况将如第3.1节中的“返回状态”列中的“返回状态”列中指定,“在AARCH64 SMC调用中使用SMC呼叫公约(ARM DEN 0028B)规范的“登记”。 此外,将如下所述应用某些其他限制。

  • sp_el0

    非零值将表明SPM已将当前CPU的堆栈指针初始化。

    该值将为0否则。

  • X4-X30

    这些寄存器的值将为0。

  • X0-X3

    SPM传递的参数。

      X0:EL3和S-EL0之间共享缓冲区的虚拟地址。 缓冲区将在安全的EL1&0翻译方案中映射,并具有前面描述的仅读取内存属性。X1:字节中的缓冲区大小。x2:cookie值(定义的实现)。X3:cookie值(定义的实现)。
    

5.4. 运行时事件委托

SPM通过同步调用(即来自非安全世界的SMC)接收安全分区服务的请求。 这些请求通过从分区接收到的最后一个MM_SP_EVENT_COMPLETE_AARCH64从分区收到的呼叫来委派给分区。 最后一个通话是为了发出安全分区初始化的完成或分区服务请求的完成。

5.4.1. MM_SP_EVENT_COMPLETE_AARCH64

  • 描述

    信号完成了最后的SP服务请求。

  • 参数

    • UINT32-功能ID

      • SVC64版本:0xc4000061
    • INT32-事件状态代码

      零或正值表示事件已成功处理。 这些值取决于委派给安全分区的原始事件。 它们被描述如下。

      • 成功:用于指示安全分区已初始化或成功处理运行时请求。

      • 大于0的任何其他值都用于响应运行时事件传递特定事件状态代码。

      负值表示错误。 事件状态代码的值取决于原始事件。

  • 返回参数

    • INT32-事件ID/返回代码

      零或正值指定事件的唯一ID被SPM委派给分区。

      在当前实现中,此参数包含MM_Communicate SMC的功能ID。 此值指示分区表明事件已委派给了非安全世界的MM_Communate请求。

    负值表示错误。 该值的格式如下:

      + NOT_SUPPORTED:从非安全世界中调用功能。
    

请参阅与每个返回代码关联的整数值的错误代码。

  • UINT32-事件上下文地址

    SPM和安全分区之间共享的缓冲区的地址,以传递事件特定信息。 缓冲区中填充的数据的格式已定义。

    缓冲区在安全的EL1&0翻译方案中映射,并具有前面描述的仅读取内存属性。

    对于SVC64版本,此参数是一个64位虚拟地址(VA)。

    对于SVC32版本,此参数是32位虚拟地址(VA)。

    • UINT32-事件上下文大小

      内存的大小从事件地址开始。

    • uint32/uint64-活动cookie

    这是一个可选参数。 如果未使用其值为SBZ。

  • 用法

此函数向SPM发出信号,表明将最后一个事件授权授予分区的事件已经完成。 该分区已准备好处理其下一个活动。 此功能的返回是响应将委派给分区的下一个事件的响应。 返回参数描述下一个事件。

  • 呼叫者责任

安全分区必须仅调用MM_SP_EVENT_COMPLETE_AARCH64向SPM委派给该请求的请求发出信号。

  • 责任

当SPM从安全分区接收此呼叫时,可以使用相应的综合征信息通过ERET指令返回控制,并在安全分区上下文中立即在调用后立即进行指令。 该综合征信息包括通话后的通用和系统寄存器值。

SPM必须保存此综合征信息,并使用它将下一个事件委派给安全分区。 该接口的返回参数必须指定事件的属性,并在X0-X3/W0-W3寄存器中填充。

5.5安全分区内存管理

一个安全分区在S-EL0处执行,这是一个无私人的异常级别。 SPM负责从安全分区中从系统地址映射中访问内存区域。 这是通过在安全的EL1&0翻译方案中使用适当的内存属性映射这些区域来完成的。 属性是指转换表中使用的内存类型,权限,缓存性和共享性属性。 这些属性及其用法的定义可以在ARMV8-A ARM(ARM DDI 0487)中找到。

安全分区所需的所有内存都是在SPM中预先分配的,甚至在首次移交给安全分区之前。 内存区域的初始访问权限是由平台端口静态提供的,应允许安全分区运行其初始化代码。

但是,它们可能不满足安全分区的最终需求,因为在安全分区初始化本身之前,可能不知道其最终内存布局。 当安全分区启动其运行时环境时,例如,可能会动态加载一些模块。 例如,安全分区可以为标准可执行文件格式实现加载程序(例如,用于在运行时加载可执行文件的PE-COFF加载程序)。 这些可执行文件将是安全分区图像的一部分。 仅当将文件加载到存储器中时,才能知道各个部分在可执行文件中的位置及其权限属性(例如,读写数据,仅读取数据和代码)。

在这种情况下,安全分区需要一种方法来更改其内存区域的访问权限。 SPM通过MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64 SVC接口提供此功能。 该接口可在特定时间窗口中提供给安全分区:从第一个进入安全分区的条目到第一个SP_EVENT_COMPLETE调用,该调用信号为安全分区已经完成了初始化。 初始化完成后,SPM将不允许更改内存属性。

本节介绍了由SPM实现的标准SVC接口,以确定和更改属于安全分区的内存区域的权限属性。

5.5.1 mm_sp_memory_attributes_get_aarch64

描述

请求来自S-EL0的内存区域的权限属性。

  • 参数

UINT32功能ID

SVC64版本:0xc4000064

UINT64基地地址

此参数是一个64位虚拟地址(VA)。

基地地址没有对齐限制。 它所处的翻译颗粒的权限属性将退还。

  • 返回参数

INT32-内存属性/返回代码

在成功时,返回代码的格式如下:

位[1:0]:数据访问权限

B’00:无访问

B’01:读写访问

B’10:保留

B’11:仅阅读访问

位[2]:指令访问权限

B’0:可执行

B’1:不可执行

位[30:3]:保留。 SBZ。

位[31]:必须是0

在故障上,返回以下错误代码:

Invalid_Parameters:不允许安全分区访问基本地址所在的内存区域。

NOT_SUPPORTED:SPM不支持安全分区可访问的任何内存页面的属性检索,或从非安全世界中调用该函数。 如果在MM_SP_EVENT_COMPLETE_AARCH64之后使用,也将其返回。

请参阅与每个返回代码关联的整数值的错误代码。

  • 用法

此功能用于请求从安全分区访问的内存区域上的S-EL0的权限属性。 存储区域的大小等于安全EL1和0转换制度中使用的翻译颗粒大小。 当前不支持检索其他内存区域属性的请求。

  • 呼叫者责任

呼叫者必须通过实现定义的方法从SPM中获得安全EL1&0转换制度的翻译颗粒大小。

  • 责任

SPM不得返回可从安全分区无法访问的内存页面的内存访问控件。

5.5.2. mm_sp_memory_attributes_set_aarch64

  • 描述

从S-EL0设置内存区域的权限属性。

  • 参数

UINT32-功能ID

SVC64版本:0xc4000065

UINT64-基地地址

此参数是一个64位虚拟地址(VA)。

基础地址的比对必须大于或等于安全EL1和0翻译方案中使用的翻译颗粒大小的大小。

UINT32-页数

从基本地址开始的页数应更改其内存属性。 页面大小等于翻译颗粒的大小。

UINT32-内存访问控件

位[1:0]:数据访问权限

B’00:无访问

B’01:读写访问

B’10:保留

B’11:仅阅读访问

位[2]:指令访问权限

B’0:可执行

B’1:不可执行

位[31:3]:保留。 SBZ。

禁止将该区域标记为RW和可执行权限的属性组合。 禁止标记具有可执行权限的设备内存区域的请求。

  • 返回参数

INT32-返回代码

成功:内存访问控件已成功更改。

拒绝:SPM正在为更改与本请求中指定区域重叠的内存区域的属性的请求服务。

Invalid_Parameter:已指定内存访问控制的无效组合。 基础地址未正确对齐。 安全分区不允许访问呼叫中指定的部分或所有内存区域。

NO_MEMORY:SPM没有内存资源来更改翻译表中内存区域的属性。

NOT_SUPPORTED:SPM不允许更改安全分区可访问的任何内存区域的属性。 功能是从非安全世界中调用的。 如果在MM_SP_EVENT_COMPLETE_AARCH64之后使用,也将其返回。

请参阅与每个返回代码关联的整数值的错误代码。

  • 用法

此功能用于更改可从安全分区访问的内存区域上S-EL0的权限属性。 存储区域的大小等于安全EL1和0转换制度中使用的翻译颗粒大小。 当前不支持更改其他内存区域属性的请求。

此功能仅在启动时间可用。 在安全分区发送第一个MM_SP_EVENT_COMPLETE_AARCARCH64之后,将撤销此界面,以表示其初始化并准备接收运行时请求。

  • 呼叫者责任

呼叫者必须通过实现定义的方法从SPM中获得安全EL1&0转换制度的翻译颗粒大小。

  • 责任

在发生失败的情况下,SPM必须保留内存区域的原始内存访问控件。 如果同时调用此函数,并且指定的内存区域重叠,则SPM必须保留S-EL1翻译方案的一致性。

5.6. 错误代码

https://trustedfirmware-a.readthedocs.io/en/latest/components/secure-partition-manager-mm.html#runtime-model-of-the-secure-partition

ATF原生篇(十九):Components-安全分区管理器(MM)(Secure Partition Manager (MM))(下)相关推荐

  1. ATF原生篇(十八):Components-安全分区管理器(MM)(Secure Partition Manager (MM))(上)

    安全分区管理器(MM)(Secure Partition Manager (MM)) 1 前言 安全分区管理器的两个实现在TF-A代码库中共存: SPM基于FF-A规范(安全分区管理器). SPM基于 ...

  2. 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器

    第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 原文: 第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 前言: 在前一章已经演示了如何使用SSMS来 ...

  3. OpenCV C++案例实战十九《制作电子相册查看器》

    OpenCV C++案例实战十九<制作电子相册查看器> 前言 一.图片读取 二.图片展示 三.键盘控制 四.效果显示 五.源码 总结 前言 本文将使用OpenCV C++ 制作电子相册查看 ...

  4. Kubernetes之(二十)Helm程序包管理器

    目录 Kubernetes之(二十)Helm程序包管理器 概念 部署Helm 下载helm 部署Tiller helm的使用 chart 目录结构 chart模板 定制安装 MySQL chart c ...

  5. 5 大分区管理器 - 最好的硬盘分区软件

    分区是一个计算机术语,指的是在硬盘上创建多个区域,以允许操作系统和分区管理器软件有效且单独地管理每个区域中的信息.拥有大量计算机使用历史的人最有可能受益于多个分区.在硬盘中进行分区的好处之一是可以更轻 ...

  6. 自定义控件三部曲之绘图篇(十九)——LinearGradient与闪动文字效果

    前言:家和万事兴 相关文章: <Android自定义控件三部曲文章索引>:http://blog.csdn.net/harvic880925/article/details/5099526 ...

  7. 普林斯顿微积分读本篇十九:微分方程

  8. 小白篇(十九):openLdap介绍(又名:Ldap介绍)

    获取原文 简短介绍 大家好,最近新闻还是很火热啊.美国大选 + 马爸爸被约谈.好吧,咱就看看热闹.今天给大家分享下openLdap(简称:ldap). 01-openLdap介绍 其实工作中很多小伙伴 ...

  9. Python遥感图像处理应用篇(十九):GDAL +numpy批量对遥感图像外围背景值进行处理

    1.问题描述 最近下载了一些遥感影像数据,这些数据都包含大量的外围背景数据,如下图所示: 外围背景值都为0值. 本文描述的是采用python批量处理外围背景,只保留最小外围背景区域. 如下图: 2.实 ...

最新文章

  1. 决心开始写博,坚持!
  2. spring 依赖注入的3种方式
  3. buuctf LSB
  4. JavaScript中的this妙用
  5. 一起谈.NET技术,从.NET中委托写法的演变谈开去(中):Lambda表达式及其优势...
  6. Webpack进阶(一) tree shaking与不同mode
  7. 苦苦发愁学习Python?七天掌握Python就在此时
  8. IOS::.a的生成,以及模拟器和真机.a 的合并
  9. python 进程间通信效率_(1)进程间几种通信方式
  10. 单声道数据转双声道_单声道转双声道
  11. 华三F100 系列防火墙 - 浮动路由联动NQA 实现双线路自动切换
  12. 网络流媒体(七)———PTSP
  13. NAND Flash(spi nand flash和nand flash)和emmc以及ufs通过uboot烧写固件的一些差异
  14. 一些需要用到的latex语句
  15. 微信支付-小程序支付全流程
  16. 自学python第四天之实现LUR算法
  17. 各种时间指标的度量值
  18. Itext 将html 字符串生成PDF 方法
  19. 为什么不敢和别人竞争_为什么你很难交到朋友?可能是因为你不敢信任他人
  20. .Net Core 实现WebSocket Server 的另外三种方式

热门文章

  1. 云服务器BBC销售渠道,云服务器bbc什么意思
  2. 多元统计分析及R语言建模(第五版)部分课后习题代码演示
  3. Java实现单点登录(SSO)方式
  4. stm32之IIC总线概述
  5. Android开发宇视监控播放,宇视科技视频监控(EZPlayer)
  6. 使用jmeter并发测试下载功能
  7. mysql删除表后清空索引_MySQL删除语句比较,清空表数据,重置自增长索引
  8. arduino四位数码管 同时输出四位数字
  9. vue3:路由守卫(全局守卫、路由独享守卫、组件内守卫)
  10. App与H5交互的几种方式