欢迎大家继续关注STM32L5入门课程(二):L5的系统新架构。
这一期,我们就来介绍,STM32L5是如何把“隔离”的概念和措施,从内核延伸出来,部署到全片系统的。
安全特性
STM32L5是一颗主打低功耗和安全应用的MCU,它的安全特性,从各个方面都比以往的STM32系列有了进一步提高。 - 它支持安全启动,这是信任链的可靠锚点:bootlock可以保证启动的唯一入口,HDP可以将用户闪存的一部分隐藏起来,通常是复位后运行的安全启动代码,使得其对后面的用户应用程序不可见。 - 为了支持CM33内核里的trustzone安全扩展,L5上的外设模块、存储模块都做了升级来配合trustzone机制 - 为了实现对软件和数据的保护,L5新增了配合trustzone的安全调试功能,可以限制用户仅能调试非安全世界代码,而无法调试安全世界的代码。另外,L5还有一个OTFDEC模块,可以对存储在芯片外Ocot-SPI flash上的密文数据或者密文代码,on the fly地解密执行和解密读取,从而解放了片上闪存空间对用户代码的限制,同时还能保证用户代码的机密性。 - 对密码学操作的硬件加速,L5继WB系列后,也新增了PKA模块,对公钥加解密操作的硬件支持 - 在防纂改检测方面,L5在以往历代STM32上,首度把静态保护升级到动态保护,符合更高要求的安全应用需求。 - STM32L5还是首个全部产品线都支持SFI的STM32系列,天生就是为安全应用而打造。基于L5的TZ硬件基础,ARM的TFM已经得到L5的支持,并经过了PSA level2认证。
可以看到,对TrustZone的支持,只是L5安全特性的一部分。本期内容我们先把片上系统如何配合trustzone讲清楚,后面还会围绕着L5的其他安全特性,全部一一展开讨论。
安全属性配置
当CPU的取指或者数据访问,经过SAU和IDAU审查,以及MPU的审查通过后,携带着HNONSEC信号来到AHB总线上,这个transaction的属性可能是安全的,或者是非安全的。右图中,蓝色的部分是AHB矩阵,是AHB 5总线矩阵,是可以传递transaction的安全属性信号的。那么作为总线连接的另外一端,AHB从设备是如何识别和应答transaction的安全属性呢?
STM32L5上的外设有两种,一种是TZ aware外设。表格里列出了STM32L5上所有的TZ aware外设。顾名思义,这些外设本身,是认识trustzone信号的。用户可以配置这些模块自己的寄存器,来让它知道自己哪些部门是可以被非安全状态的CPU访问,哪些是只能被安全状态的CPU访问。
另外一种外设,本身的寄存器没有和TZ,security相关的寄存器可以设置,它们全靠自己的话,是完全不知道啥安全访问,非安全访问的,但是在它们的前面,首先面对AHB5总线传来的带安全属性的transaction的,有一个叫做PPC的硬件,全名Peripheral protection controller,它是属于TZSC模块的一部分。TZSC,全称trust zone security controller。是STM2L5为了配合CM33内核的TZ安全扩展,新加的一个帮助片上众多非TZ aware的外设,识别secure访问和非secure访问的硬件模块。
如果拿右边的芯片“系统架构” 简图和以前的STM32比较,会发现,除了最上面的flash memory,从SRAM1开始,到AHB1、AHB2外设、到外部存储区,它们和AHB5总线矩阵的AHB slave端口,不是直接连接。原因很简单,就是刚才说的,这些外设 不能识别 HNONSEC信号,因此前面有一个额外的东西,参考手册上叫它‘’secure gate‘’,来做识别,阻拦或者放行寻址到后面SRAM1、SRAM2、AHB上外设的transaction。而最上面的Flash,为什么可以直接连到AHB slave端口呢?因为左边的表格告诉我们,flash memory是TZ aware的外设呀。
右边的芯片“系统架构” 简图和以前的STM32比较,还有一个地方不同:左上角,内核出来两条bus:C-bus和S-bus,都是可以取指取数据;仅仅是target的目标区域不同。 C就是target到code region的,S是target到除了code的其它region的。 ST在芯片实现时,在C-bus上接了一个Icache,再分出来了Fast-bus和Slow-bus,接到AHB总线矩阵上。扩展了target的区域,不仅是Code region,而是所有内部、外部存储区都可以访问。
GTZC,global trustzone controller,全局TZ控制器。它是STM32L5把内核TZ安全概念扩展到整个片上系统的关键,我们一定要弄清楚它的工作原理。我觉得看图说话比较好,框图里能包含很多信息,我截了参考手册里GTZC这个外设章节里的系统框图来说明它的结构和功能。
从图中可以看到,GTZC有三个子模块组成。第一个MPCBB,我用绿色标注。MPC就是memory protection unit的简称。BB是block base的。因此MPCBB保护的对象,是我们STM32L5片上系统里的internal SRAM区域。为什么是BBx,因为我们有SRAM1和SRAM2,因此有两组寄存器来控制。SRMA上的安全区域,以256字节为单位来划分block。
再来看第二个子模块,TZSC,我用紫红色标注。TZSC出去的有4条线,一条深绿色的,三条紫红色的。我们先来看深绿色线条的走向,它连到了MPCWMx,又见到了熟悉的MPC字样,知道它也是保护的存储区域,是外部存储区,即FSMC和Octo-SPI所连的外部flash区域。但是这里是WM结尾,不是BB结尾。WM是watermark的意思,这是一种粗粒度的设置。不能像BB那样,每个block单独设置安全还是不安全。WM只能在原本安全的底色上,划出两道线,来指定非安全区域的范围。
TZSC出去的其他几条紫红色线条,分别连到了AHB/APB bridge、AHB master和AHB slave,去控制直接连接在AHB总线上的主设备、从设备;以及间接连接在AHB总线上的APB从设备。
因此一眼可以看出,TZSC这个子模块,从secure gate这个功能角度,控制的设备最多。各种外设,以及外部存储器。
紫色的TZIC,是第三个子模块,全称是TZ illegal access concentrator。它监控并搜集所有系统上安全角度的非法访问,以触发GTZC这条用户中断。
这张图从另外一个角度展示了GTZC的三个子模块及其对应的功能。同时也能体现STM32L5里TZ aware的IP的位置。 TZ Aware的外设,【】比如flash memory, GPIO , RTC,它们无需GTZC站在前面,帮它们审查过来的transaction的安全属性,但是对它们的安全方面非法操作,也会产生IA事件,即illegal access event。 非TZ aware,又可以被配置成secure的外设,即这里被TZSC子模块里的PPC保护的Securable IP,【】比如UART flash已经是TZ aware的外设了,剩下的存储器件,还有internal Flash,【】受MPCBB模块保护,提供精细粒度的Block base方式配置。片外flash则是受MPCWM保护,提供粗粒度的WM方式配置。
我们后两节课,讲解具体实例demo和hands-on环节的时候,会用到UART、SRAM、Flash、GPIO。因此,接下来,我们对这四个外设的TZ相关安全特性,做一个简要介绍。
片上Flash memory是TZ aware的外设,因此它有相关的寄存器来配置自己的访问安全属性。除此之外,它甚至还有选项字节的配置,可以使得预定义的安全属性在上电即生效。Flash通过选项字节,提供water mark方式的配置,可以标出哪一段区域是安全的。还可以同时标出哪一段区域是用户程序不可见的隐藏区域。对于一个virgin的STM32L5芯片,使能了TZ安全扩展后,SECWM这个选项字节的默认状态是全片都是安全的,如图所示。
用户配置SECWM,指定出安全和不安全的区域,以及HDP用户不可见区。这个配置apply到系统后,下次上电就生效。上电后,用户还可以通过寄存器SECBB来以page为粒度,精细地对安全区域和非安全区域再做调整,如图所示。然后按照两种设置叠加,取安全等级高的原则,最后得到用户flash的安全配置,如最右边的图示。
Flash的各个page被最终配置好安全属性后,在安全扇区的操作,和非安全扇区的操作,就依据两套不同的控制寄存器和状态位来完成了。非安全区域上的flash操作,产生的中断连到Flash这条NVIC线上;安全区域上的flash操作,对应中断连到Flash_S这条NVIC中断线上。
这就是一个典型的TZ aware IP,无需GTZC的帮助,自己可以配置自己哪些部分是安全transaction可以访问,哪些部分只能非安全transaction访问。
SRAM自己没有配置自己哪些部分是安全区域,哪些部分是非安全区域的能力,因此它需要GTZC的帮助。具体依赖的就是GTZC中刚才介绍的第一个子模块,MPCBB。从左边这个“STM32L5系统架构简图”可以看到,MPCBB是站在SRAM和AHB总线矩阵之间的那个“门卫”。
片上flash,一直是按照flash page组织的,L5上是2K一个page,或者4K一个page,取决于当前flash是双bank还是单bank模式。
SRAM现在为了设置安全部分区域,也特意逻辑上划分出256字节为单位的一个个block。通过MPCBB寄存器组,可以对这些SRAM上的block做独立的安全属性配置。
寄存器复位值,每个位域都是1,表示对应的block是安全的。
SRAM就是一个典型的securable的外设,通过GTZC的MPCBB子模块来配置其区域的安全性。
另外应该可以提到的应该是SRAM的访问控制属性,S的区域可以被什么样的transaction访问,NS的区域可以被什么样的transaction访问,以及可以通过寄存器设置允许S transaction访问NS的SRAM区域
|