万物互联,安全尤为重要,而设备终端是万物互联的源头,也是安全保护的源头。安全可信计算环境(TEE)从处理器MPU向微控制器MCU进行延伸,已经是大势所趋。
为了更好地提高MCU的安全性能,Arm在ARMv8-M架构中引入了TrustZone技术。ARMv8-M中的TrustZone技术是一种可选择的安全扩展,旨在为各种嵌入式系统应用提供基本的安全保障。
TrustZone技术将系统分为安全区和非安全区两部分,并通过特殊的指令实现两种区域内函数的相互访问。
TrustZone技术已经相当成熟,被广泛应用在Arm Cortex-A系列处理器上。现在TrustZone技术被扩展到了ARMv8-M 处理器中,它与Cortex-A处理器中的TrustZone并不是完全相同的,本篇参考网上一些资料和自己的开发心得介绍下基于Cortex-M处理器的TrustZone技术。
上节提到一些有内核相关的寄存器也被备份到了安全/非安全区域中,下图展示了具体哪些通用/特殊寄存器被备份到两种内存中。
在Cortex-M33中,如果选配了TrustZone技术,则4G的内存空间将被划分为安全和非安全内存区域。安全内存空间又可以进一步划分为两种类型: Secure和Non-secure Callable(NSC)。
三种内存区域的特性:
引入NSC存储区的原因,是为了防止其他二进制数据(例如,具有与SG指令的操作码相同的值的查找表)被用作安全状态的入口函数。
内存区域的安全属性是由Secure Attribution Unit(SAU)和Implementation Defined Attribution Unit(IDAU) 共同决定的。
SAU的作用和IDAU是相似的,都是用于分离安全区和非安全区。两者最大的区别是SAU位于CPU内部,IDAU在CPU外部。
无论是IDAU和SAU都可以定义一块内存的安全属性,此时CPU会选择两者中较高的安全属性作为此块内存最终的安全属性,最高的安全属性是Secure,其次是Non-Secure Callable,最后是Non-secure。
IDAU除了可以向处理器指示特定存储器地址是Secure、NSC还是Non-secure,提供存储器地址所在的区域编号之外,它还可以标记免受安全检查的内存区域,例如ROM表。
IDAU由芯片厂商设计,一般不会对IDAU进行修改。
不同的芯片厂商设计也不是相同的。
SAU为每个内存区域定义了一个Region Number(RN)。RN可以被TT指令用来决定目标内存的访问权限和安全属性。RN的数量可以被SAU配置为0、4或者8。
STM32 L552xx 和 NXP LPC55S6x 的RN数量是8,也就是说最多可以划8个区域。
SAU是由开发者配置的,开发者可以在IDAU配置的内存属性的基础上,用SAU去重定义内存中的一些区域的安全属性,CPU会根据IDAU和SAU的配置,决定内存的最终安全属性。
复位后,默认的SAU配置是: 所有存储空间都是安全的。