TrustZone的内存系统和内存分区

在实现了TrustZone功能的系统中,4GB的存储空间1会分成安全和非安全两种不同的内存区域。

其中安全空间又分为两种不同的类型:

安全Secure(S):

安全地址空间指的是只能通过安全软件或者安全主设备访问的内存空间或者外设的寄存器。
安全访问指的是访问根源的主设备被认为是安全的,这样的主设备去访问一个安全地址称为安全访问。

非安全可调用Non-Secure Callable(NSC):

NSC是一种特殊的安全空间。在ARMv8-M处理器中,只允许SG指令运行在这个空间里面,SG指令是实现从非安全到安全空间相互转换的指令,这种限制避免了在非安全空间中意外的调用SG指令。

一般NSC空间会包含一个函数调用表(entry point),为了避免从非安全空间直接跳转到函数调用表,我们定义了SG(Secure Gateway)指令。

当一个非安全程序调用安全函数的时候:

  • API的第一个指令必须是SG指令
  • SG指令必须在NSC空间,这个空间通过安全属性单元(Secure Attribute Unit SAU)或者安全定义实现单元(Implementation Defined Attribute Unit IDAU)进行定义。

引入NSC空间也是为了系统的安全,比如,如果一个二进制数据的内容刚好是SG指令,而这个数据意外的被当做指令运行,从而产生了一个非预期的操作。通过引入NSC空间就可以避免这种情况。而通过引入NSC和S两种空间,安全空间(S)中的内容也不会被外界意外访问,而只能通过API调用的形式进行访问。

非安全空间(Non-secure NS)

非安全空间可以被所有运行在器件上的软件访问,非安全访问指的是访问发起者(主设备)是非安全的,访问地址也是非安全地址。系统必须保证安全空间不能被非安全的访问操作访问。

译者的一些补充

其实TrustZone的最底层实现非常简单,它的实现就是将地址总线进行了扩展,它在每次访问的时候,地址的最高位会有一个标志位,这个标志位可以表示此次访问时安全访问或者非安全状态下的访问。在M系列处理器实现的时候,实际每个内存区域或者模块寄存器都是有两套地址的,一套是非安全空间下的地址,另一个是安全空间下的地址,这样就可以区分两种不同的访问形式。


  1. 32位系统总的内存空间是4GB

发表新评论