存储器别名可增强安全性 NXP 的 LPC55S69JBD100K 和 STMicroelectronics 的 STM32L552VET6 等 TrustZone 处理器通过将物理程序存储器别名化为安全和非安全存储器空间,来管理执行。例如,STMicroelectronics 的 STM32L552VET6 两次将闪存和 SRAM 中的代码别名化,一次别名化为非安全地址范围(0x0800_0000 至 0x0BFF_FFFF),再次别名化为安全地址范围(0x0C00_0000 至 0x0FFF_FFFF)。同样,NXP 的 LPC55S69JBD100K 将物理程序存储器别名化为从 0x0000_0000 开始的非安全空间,以及从 0x1000_0000 开始的安全空间。这些处理器中的每一个都对其他存储器类型和外设使用类似的方法,将它们两次别名化为安全和非安全区域。 当处理器需要访问某个存储器位置时,能否访问该位置由两个硬件单元生成的安全属性确定: - 实现定义属性单元 (IDAU) 是处理器核心外部的固定硬件单元,提供由制造商定义的存储器映射的固定安全状态。
- 安全属性单元 (SAU) 是集成在处理器核心中的可编程单元,可用于定义多达八个存储器区域的安全状态。
在系统初始化期间,在安全模式下运行的配置例程通过设置几个 SAU 寄存器来定义每个区域的安全状态;这些寄存器包括: - SAU 区域编号寄存器 (SAU_RNR),用于选择一个区域以进一步进行操作
- SAU 区域基地址寄存器 (SAU_RBAR),用于定义区域的起始地址
- SAU 区域限制地址寄存器 (SAU_RLAR),用于定义区域的范围
在 STM32L5 系列的 STM32Cube MCU 软件包中,STMicroelectronics 提供了多个模板文件,这些文件演示了如何使用包含 SAU 配置在内的处理器功能。如清单 1 所示,开发人员可以使用宏 (SAU_INIT_REGION(n)) 为每个配置参数定义这些区域。该宏能够设置 SAU 结构中的寄存器值,而这些值会在配置设置写入器件时使用。
/*
// <e>Initialize SAU Region 0
// <i> Setup SAU Region 0 memory attributes
*/
#define SAU_INIT_REGION0 1
/*
// <o>Start Address <0-0xFFFFFFE0>
*/
#define SAU_INIT_START0 0x0C03E000 /* start address of SAU region 0 */
/*
// <o>End Address <0x1F-0xFFFFFFFF>
*/
#define SAU_INIT_END0 0x0C03FFFF /* end address of SAU region 0 */
/*
// <o>Region is
// <0=>Non-Secure
// <1=>Secure, Non-Secure Callable
*/
#define SAU_INIT_NSC0 1
/*
// </e>
*/
/*
// <e>Initialize SAU Region 1
// <i> Setup SAU Region 1 memory attributes
*/
#define SAU_INIT_REGION1 1
/*
// <o>Start Address <0-0xFFFFFFE0>
*/
#define SAU_INIT_START1 0x08040000 /* start address of SAU region 1 */
/*
// <o>End Address <0x1F-0xFFFFFFFF>
*/
#define SAU_INIT_END1 0x0807FFFF /* end address of SAU region 1 */
/*
// <o>Region is
// <0=>Non-Secure
// <1=>Secure, Non-Secure Callable
*/
#define SAU_INIT_NSC1 0
/*
// </e>
*/
.
.
.
**
\brief Setup a SAU Region
\details Writes the region information contained in SAU_Region to the
registers SAU_RNR, SAU_RBAR, and SAU_RLAR
*/
__STATIC_INLINE void TZ_SAU_Setup (void)
{
#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)
#if defined (SAU_INIT_REGION0) && (SAU_INIT_REGION0 == 1U)
SAU_INIT_REGION(0);
#endif
.
.
.
#define SAU_INIT_REGION(n) \
SAU->RNR = (n & SAU_RNR_REGION_Msk); \
SAU->RBAR = (SAU_INIT_START##n & SAU_RBAR_BADDR_Msk); \
SAU->RLAR = (SAU_INIT_END##n & SAU_RLAR_LADDR_Msk) | \
((SAU_INIT_NSC##n << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk) | 1U
清单 1:此代码段包含在 STMicroelectronics 的 STM32L5 系列 STM32Cube MCU 软件包内的模板中,向开发人员展示如何定义存储器区域及其相关的安全状态。(代码来源:STMicroelectronics) IDAU 和 SAU 共同确定存储器位置是否可访问,并返回两者中最高的安全级别。由于处理器使用与其安全/非安全工作状态相对应的存储器别名,IDAU 与 SAU 的组合生成的安全属性可确保仅访问具有匹配安全级别的区域(图 5)。
图 5:在 NXP LPC55S69JBD100K 中,IDAU 和 SAU 组合起来为每个存储器别名生成一个安全属性,从而有效地删除不允许在各自区域外运行的代码。(图片来源:NXP Semiconductors) 例如,当 NXP 的 LPC55S69JBD100K 在安全模式下运行时,由 IDAU 和 SAU 生成的安全属性将阻止访问物理存储器块的安全别名中包含的非安全应用程序,从而有效地从安全别名中消除该非安全代码。相反,当处理器在非安全模式下运行时,IDAU 和 SAU 安全属性将有效地从产生的非安全别名中清除安全应用程序。
|