STM32U5: Device partition_stm32U575xx.h and partition_stm32U585xx.h
STM32L5: Device partition_stm32l552xx.h and partition_stm32l562xx.h
The following example CMSIS code shows how the you can configure the SAU for two regions
// Configure SAU using CMSIS
// Configure SAU Region 0
// Start Address 0x00200000
// Limit Address 0x003FFFE0
// Secure non-scure callable
// Use CMSIS to access SAU Region Number Register (SAU_RNR)
// Select region 0
SAU->RNR = (0);
// Set SAU Region Base Address Register (SAU_RBAR)
SAU->RBAR = (0x00200000U & SAU_RBAR_BADDR_Msk);
// Set SAU Region Limit Address Register (SAU_RLAR)
SAU->RLAR = (0x003FFFE0U & SAU_RLAR_LADDR_Msk) | 1U << SAU_RLAR_NSC_Pos)
SAU_RLAR_NSC_Msk) | 1U
// Configure SAU Region 1
// Start Address 0x20200000
// Limit Address 0x203FFFE0
// Non-secure
// Select region 1
SAU->RNR = (1);
// Set SAU Region Base Address Register (SAU_RBAR)
SAU->RBAR = (0x20200000U & SAU_RBAR_BADDR_Msk);
// Set SAU Region Limit Address Register (SAU_RLAR)
SAU->RLAR = (0x203FFFE0U & SAU_RLAR_LADDR_Msk) | 0U << SAU_RLAR_NSC_Pos)
SAU_RLAR_NSC_Msk) | 1U
// Enable SAU
// Use CMSIS to access SAU Control Register (SAU_CTRL)
// Set ENABLE bit[0] to 1
// Set ALLNS bit[1] to 1 All memory is secure when SAU is disabled
SAU->CTRL = ((SAU_INIT_CTRL_ENABLE << SAU_CTRL_ENABLE_Pos) &
SAU->SAU_CTRL_ENABLE_Msk) | ((SAU_INIT_CTRL_ALLNS << SAU_CTRL_ALLNS_Pos) & SAU_CTRL_ALLNS_Msk) ;
1. Memory
如果在ARM上启动安全扩展的功能,4GB的内存被划分为安全和非安全两个区域。安全区域还会再次被细分(NSC和S)。
1.1 Secure (S)
ARM TrustZone 技术创建了一个安全的执行环境,使得特定的内存区域和外设只能被安全软件或安全主体访问。这里的“安全地址”指的是那些被指定为只能由安全状态下的软件访问的内存地址或外设地址。“安全事务”则指的是由安全主体(例如处理器的安全模式)发起并针对安全地址的操作。
例如:
1.2 Non-Secure Callable (NSC)
在ARMv8-M架构中,NSC(Non-secure Callable)是一种特殊类型的安全内存区域。这种设计主要是为了在保持系统安全性的同时,提供一种从非安全状态(Non-secure state)到安全状态(Secure state)的安全过渡机制。理解这一点,需要先了解ARM TrustZone的一些基本概念:
为什么要这么设计?
举一个例子
假设有一个安全函数,用于加密数据,这个函数位于安全状态下执行的代码中。为了让非安全状态下的应用程序能够请求这种加密服务,开发者会在NSC内存中放置一个包含SG指令的小函数或"网关"。当非安全应用程序需要进行加密操作时,它会调用这个NSC内存中的函数。这个函数随后使用SG指令安全地转换到安全状态,并调用实际的加密函数。完成操作后,控制权安全地返回到非安全状态。
以下是一个简化的伪代码示例,展示了如何在ARMv8-M架构下使用NSC内存和SG指令来实现从非安全状态到安全状态的过渡。这个例子包含了一个非安全函数调用安全函数的场景。
首先,定义一个安全函数,这个函数实际上在安全状态下执行,比如一个加密操作:
然后,设置一个NSC区域的“网关”函数。这个函数包含一个SG指令,它允许从非安全状态安全地跳转到安全状态:
最后,非安全状态下的代码可以调用这个NSC区域中的网关函数来安全地执行安全状态下的操作:
在这个例子中,非安全代码通过调用位于NSC内存中的NSCGateway函数来安全地访问安全函数SecureFunction。这种方式确保了只有预定义的、位于NSC内存中的代码才能触发从非安全状态到安全状态的转换,从而保护了系统的安全性。
在ARM TrustZone中,NSC内存区域通常包含一系列小的分支镶嵌(branch veneers),这些分支镶嵌作为进入点(entry points),参考:https://developer.arm.com/documentation/dui0474/i/CHDBDFBH 。分支镶嵌是一种简短的代码片段,通常用于实现从一个代码区域跳转到另一个代码区域的功能,尤其是当这些区域具有不同的安全级别时(如从非安全状态跳转到安全状态)。
1.3 Non-Secure
在理解TrustZone技术时,重要的是要了解其中的一些关键概念,比如Non-secure addresses和Non-secure transactions。
transactions /trænˈzækʃənz/ n. 处理,[图情]会报;汇报(transaction 复数)
TrustZone技术确保非安全交易不能访问安全地址。这是通过硬件和软件的安全配置来实现的,以保证安全区域的数据和操作不会被非安全软件访问。这种访问控制是TrustZone实现安全分隔的关键部分。
如何保证非安全Transaction不可以访问安全地址?
ARM TrustZone通过硬件和软件的协同工作来确保非安全(Non-secure)交易无法访问安全(Secure)地址。这种安全机制的实现涉及多个层面:
通过这种多层次的安全策略,TrustZone确保非安全交易无法访问或影响安全地址,从而为敏感数据和操作提供了一个隔离和保护的环境。这种机制对于构建安全的嵌入式系统和移动设备至关重要,可以有效防止数据泄露和恶意软件攻击。
2. Attribution units (SAU & IDAU)
该机制更像是一个“断言”仲裁机制,根据用户和ARM自身的配置,断定操作是否是安全的。
在ARM TrustZone技术中,SAU(Security Attribution Unit)和IDAU(Implementation Defined Attribution Unit)是两个关键组件,它们协同工作以定义和控制安全(Secure)和非安全(Non-secure)内存及外设的访问权限。以下是它们的详细解释:
SAU和IDAU在ARM TrustZone中的协作机制如下:
这种机制确保了即使操作系统或安全监视器在运行时调整SAU配置,芯片制造商在设计阶段设置的基本安全策略也得以保留。这样,TrustZone可以提供既灵活又强大的安全控制手段,适应各种不同的安全需求和应用场景。
可配置性
安全属性单元(SAU)和实现定义属性单元(IDAU)的功能具有非常灵活的可配置性:
SAU的可编程性与MPU的相似性:
当处理器处于安全状态时,SAU是可编程的。这种可编程性允许动态管理安全,适应不同的操作需求。它的编程模型与内存保护单元(MPU)类似,意味着它用于定义和控制内存或资源的访问权限。
SAU的实现是可以由设计师配置的。这意味着在设计一个基于TrustZone技术的系统时,SoC设计师可以根据具体需求来配置SAU。虽然SAU始终存在,但SoC设计师可以定义区域的数量,这些区域决定了哪些内存或资源是安全的,哪些是非安全的。IDAU与SAU的结合使用:
通过这种方式,可以灵活地将系统的内存空间分配给安全或非安全状态,同时保持基础安全策略的一致性。
STM32的设计实例
在STM32中有IDAU和SAU的设计:
根据STM32公司的配置,会有不同的安全仲裁结果
STM32L5/U5系列微控制器(MCU)的内存映射特性,这些微控制器遵循ARM的建议,实现了重复的内存映射:一个用于安全视图(Secure view),另一个用于非安全视图(Non-secure view)。以下是其主要特点:
STM32L5/U5有八个SAU(安全属性单元)区域。用户可以通过SAU更改所需的安全配置分区。当TrustZone启用时,SAU默认将所有地址视为安全的:所有内存区域都被视为安全区域。这提供了一种机制,允许用户根据具体应用的需要来动态配置和调整内存区域的安全属性。
举个例子
STM32展示如何通过不同的内存视图来实现对外设的安全访问控制:
一个外围设备(peripheral)在非安全视图中被解码到地址0x4000 0000,而在安全视图中被解码到地址0x5000 0000。这意味着相同的外设可以在两个不同的地址范围内访问,根据其安全状态的不同。根据SAU(安全属性单元)和IDAU(实现定义属性单元)的编程,安全代码通过生成安全交易来访问安全视图中的外设,而非安全代码则在非安全视图中的另一个地址访问同一外设。这种机制允许不同安全级别的代码分别访问相同的硬件资源,但在不同的地址和安全环境下进行。
外设的安全属性是由GTZC(全局信任区配置控制器)或TZSC(信任区安全控制器)定义的。这些控制器决定了哪些外设可以在安全状态下访问,哪些可以在非安全状态下访问。访问是否被授权或拒绝取决于外设的安全属性如何定义。
SAU configuration在STM32中也是有地方配置的:
The following example CMSIS code shows how the you can configure the SAU for two regions
3. Switching between Secure and Non-secure states
ARMv8-M 安全扩展为安全(Secure)和非安全(Non-secure)软件之间提供了直接调用的能力。这是ARMv8-M体系结构的一个重要特性,它极大地增强了在同一处理器上运行安全敏感和常规任务的灵活性和效率。
在ARMv8-M处理器中,为了处理状态转换(即从安全状态到非安全状态,或从非安全状态到安全状态的转换),提供了几个专门的指令。这些指令包括 SG、BXNS 和 BLXNS。它们各自的功能如下:
3.1 函数调用及异常处理
在ARMv8-M体系结构中,非安全程序调用安全API以及安全程序调用非安全软件的过程及其安全机制,解释为:
非安全程序调用安全API:
安全程序调用非安全软件:
FNC_RETURN
。Note, 在安全函数调用过程中,安全软件可以选择将某些寄存器值作为参数传递给非安全代码。同时,为了保护敏感数据,安全软件会在调用完成前,清除寄存器中的其他安全数据。
3.2 安全状态与工作状态变换
在ARMv8-M体系结构中,状态转换如何通过异常和中断触发,以及这些状态转换如何影响中断处理过程。下面是对这些概念的详细解释:
在ARMv8-M体系结构中,状态转换不仅可以由函数调用触发,还可以由异常和中断引起。每个中断都可以被配置为安全(Secure)或非安全(Non-secure),这由NVIC_ITNS(中断目标非安全寄存器)决定,该寄存器只能在安全世界中编程。当处理器运行非安全或安全代码时,可以发生任何类型的中断,无论是安全的还是非安全的。
如果到达的异常或中断与当前处理器状态相同(即安全中断发生在安全状态,非安全中断发生在非安全状态),则异常处理序列几乎与现有的M系列处理器相同,从而保持低中断延迟。主要的区别发生在非安全中断在执行安全代码时被处理器处理的情况。在这种情况下,处理器会自动将所有安全信息推入安全栈,并从寄存器组中清除这些信息,以避免信息泄露。
所有现有的中断处理特性,如中断嵌套、向量化中断处理和向量表重定位都得到支持。TrustZone技术在ARMv8-M体系结构中保持了现有M系列处理器的低中断延迟特性,尽管由于需要将所有安全内容推入安全栈,从安全到非安全的中断会产生稍微更长的中断延迟。
异常模型的增强也适用于浮点单元中寄存器的懒堆栈处理。懒堆栈用于减少异常序列中的中断延迟,除非中断处理程序也使用FPU,否则可以避免堆栈浮点寄存器。在ARMv8-M体系结构中,同样的概念应用于避免堆栈安全浮点上下文。在安全软件使用FPU且非安全中断处理程序不使用FPU的情况下,可以跳过FPU寄存器的堆栈和解堆栈处理,以提供更快的中断处理序列。
4. Security states of the processor
ARMv8-M体系结构中的安全状态和非安全状态的基本概念,以及安全与非安全软件之间的函数调用和跳转。这些是理解ARM TrustZone技术的核心要素。以下是对这些概念的简化解释:
程序地址与处理器安全状态:
安全与非安全软件之间的函数调用和跳转:
这种机制确保了在ARMv8-M体系结构中安全和非安全软件之间的调用和跳转是受控和安全的。通过这种方式,TrustZone技术为在同一处理器上运行安全敏感和常规任务提供了强大的工具,同时确保了整个过程的安全性和正确性。
5. Global TrustZone controller (GTZC)