TrustZone介绍
TrustZone是CM33内核的一个新的特色。这个特色主要是提高安全性的。在需要安全性的场合,我们认为可以将其内容分成两部分:敏感信息和一般的信息。为了防止敏感信息泄露,需要将敏感信息隔离出去。这样就可以保护敏感信息。而TrustZone就是在内核的层面上提供了这种隔离的特性。CM33内核可以看成是CM4+TrustZone的组合。
TrustZone就是在内核的层面的保护,由SAU/IDAU和MPU进行管理(上图中的2个蓝色方框)。但只有内核层面的管理还不够,还需要对Flash、SRAM和外设这些ST扩展的部分进行管理,因此ST公司又在内核和外设之间提供管理单元。Flash有自己的管理单元。GPIO也有自己的管理单元,这种有自己的管理单元的外设称为TrustZone-aware外设。而其它的没有自己管理单元的外设,则是被GTZC管理,这种外设称为securable外设。GTZC又包含了3个子模块:MPCBBx、TZSC和TZIC。其中MPCBBx负责管理对SRAM的访问,TZSC负责对外部存储器和外设的访问,TZIC则是对相应的事件进行管理。
所以TrustZone实际上是两重管理的,分别来自ARM设计的内核,以及ST设计的外设部分(包含Flash和存储器)。TrustZone的功能使得程序在寄存器的级别也实现了隔离,能够最大的程度保证敏感信息的安全。
TrustZone划分安全区和非安全区
而安全属性分为了三种:安全、非安全可调用和非安全。前两个都处于安全区,最后一个是非安全区的。安全和非安全好理解,那么非安全可调用要怎么理解呢?这就类似于电路设计时的光耦,负责连接非安全区和安全区,非安全区的代码想要调用安全区的代码,就需要通过非安全可调用的代码。如下图所示,其中NSC指的就是非安全可调用,NS指的非安全,S指的安全。
SAU/IDAU共同确定了4G地址范围(因为是32位,所以地址总线的寻址范围是2的32次方,即4G)的安全属性:安全和非安全的。也就是对4G的范围进行分区,如下图所示。从下图可以看出SAU和IDAU定义的安全属性并不一致,那么最终安全属性则是取决于二者的叠加。
可以看第2行“代码Flash存储器”中,包含2个区域,其中0x08000000-0x0BFFFFFF是非安全区,0x0C000000-0x0FFFFFFF是安全或非安全可调用。但是我们知道STM32的Flash地址是从0x08000000开始的,那么怎么会出现在0x0C000000地址呢?这是用了别名区的机制,我们可以把别名区理解成地址的重映射,可以将Flash的一部分地址重映射到0x0C000000-0x0FFFFFFF的范围里,这样就把这部分Flash设置成了安全或安全可调用属性。具体的如何映射,在后面讲解。
同理对SRAM的管理也是利用的别名区的方式,将SRAM也分成2部分,一部分是安全属性的,一部分是非安全属性的。
总结
TrustZone的内容比较多,从上面的内容可以对TrustZone有个大致的了解,也了解了内核对安全属性的管理。但是还没讲GTZC的作用,没讲访问规则,还有软件编写要如何实现。这些下次在分享。