RISC-V MCU中文社区

【分享】 RISC-V实现安全应用程序环境

发表于 GD32VF103 MCU 2021-07-20 17:48:21
0
586
2

RISC-V实现安全应用程序环境

 1所示,在RISC-V中构建安全的应用程序环境很简单。安全应用程序环境的功能在逻辑上依赖于可信引导加载程序和安全元件功能,以引导安全环境。安全监视执行后,可以使用标准RISC-V功能构建安全应用程序环境。该过程可以分解为如下的简单操作:

1) 定义每个管理员模式“区域”的内存范围。

2) 配置每个管理员模式操作系统环境。

3) 处理跨越“区域”的上下文切换。

 安全的应用环境

使用RISC-VPMP技术和权限模型可以轻松完成这些操作。如 2所示,要为操作系统执行配置任意数量的区域,可以使用PMP技术创建物理内存的片段。每个物理内存片段将被指定给所给定的区域。这允许创建任意数量的区域,并且仅受端点中的RAM总量或实现每个区域所需的PMP配置寄存器的数量限制。

安全的PMP区域

这可以通过两种方式其中之一来完成。工程师可以为每个区域创建多个子区域。也可以创建一个包含所有会被这个区域所使用内存的内存区域。如果管理员模式的区域打算运行实现虚拟内存管理的标准内核,它将能够保护自己的内存和相应用户模式的内存。因此,定义安全应用程序环境的工程师可以选择定义单个区域,并让监管者使用该物理区域内的MMU管理内存。或者,可以定义多个区域,允许定制的监管内核实现由物理内存保护所支持的虚拟内存保护的变体。在包含的管理员模式环境中实现安全区域可能需要多个物理内存区域配置。这可用于包含存储区域中的机密信息,这些机密信息进一步受设计种没有缓存的紧密集成内存(Tightly Integrated MemoryTIM)功能或其他所需属性的限制。例如强制限制物理内存区域内对抗代码执行的可能性,可以确保攻击者不会滥用内核功能来改变成对攻击者有利的内存特权。

在每个区域启动时,机器模式执行程序必须通过为特定区域及其属性配置的物理内存区域。这允许管理员内核准确地创建一个与底层PMP保护机制配合良好的虚拟内存布局。

实施多个区域

作为简化示例,将在物理存储器中定义五个区域。这需要至少五个受保护的内存区域:一个用于机器模式,一个用于机器模式的核心机密,一个用于每个区域。从机器模式内存保护开始。在此示例中,机器模式控制从存储器基址(地址0x00000000)到片外存储器起始(地址0x20000000)的物理存储器。在这个虚构的片上系统环境中,该存储空间包括对所有存储器映射外设,掩模ROM,调试功能和其他标准SoC技术的保护。创建第二个区域以保护DTIM,从地址0x80000000开始。

/* set up machine mode */

a_field=0x01;//TOR

1_field=0x01;//Not locked (M-Mode can access it)

rwx_fields=0x07;//Read,Write,Exec

/* use pmp0cfg with TOR because we automatically inherit a base addr of 0 */

pmp0cfg=((1_fields7)|(a_fields3)|(rwx_fields0) );

pmpaddr 0=0x20000000UL ;

old=pmpcfg0 & 0xffffff00;

pmpcfg0=(old |(pmp0cfg) );

/* set up DTIM */

a_field=0x01;//TOR

1_field=0x01;//Not locked (M-Mode can access it)

rwx_fields=0x03;//Read,Write

pmp2cfg=((1_fields7)|(a_fields3)|(rwx_fields0) );

pmpaddr 1=0x80000000UL ;//Start of DTIM

pmpaddr 2=0x90000000UL ;//End of region

old=pmpcfg0 & 0xff00ffff

pmpcfg0=(old |(pmp2cfg16) );

在机器模式及其被保护的机密信息的情况下,RAM可以切割成适合不同区域的子区域。假设每个世界需要256MB的物理内存,可以创建三个独立的256MB区域,具有读写、

执行等不同的权限。

 安全独立启动

通过为每个世界定义单独的内存区域,机器模式执行程序(监视器)可以选择以两种区域间切换到任一个区域。监视器可以在每个环境之间使用调度程序和上下文切换。也可以主要将处理器时间专用于非安全世界,并根据需要将控制转移到每一个安全世界。后一种模式需要的监视器少得多,尽管这两种模型实现起来相当简单。这个例子假设了后一种模型。

为了在每个区域之间切换上下文,监视器不仅需要识别何时应该发生上下文切换,还需要在每个区域中实施保护。虽然这看起来像是开销,但像ARM的竞争环境使用虚拟化技术来对工程师隐藏相同的功能。然而,TrustZone的虚拟化技术的成本和复杂性只提供构建单一安全区域的能力,所提供的价值却过少了。相比之下,RISC-V以最小的区域之间切换成本提供了无限的潜力。

要在区域之间切换,监视器可以让操作系统管理页表,同时管理物理内存保护。或者,监视器可以代表每个内核管理页表。在以前的模型过程如下:

1) 冲洗TLB

2) 保存satp寄存器的内容。

3) 保存当前区域的通用寄存器上下文。

4) 禁止访问当前区域的物理内存。

5) 恢复下一个区域的satp寄存器内容。

6) 允许访问下一个区域的物理内存。

7) 恢复下一个区域的通用寄存器上下文。

8) 跳转到管理员模式。

要刷新TLB只需执行fence指令,即保证所有已调度的内存操作都已完成:

/* In assembly */

fence;

fence.i