Armv8-M的TrustZone技术之内存系统和内存分区

如果实现了安全扩展,4GB的内存空间将被划分为安全和非安全内存区域。安全内存空间进一步分为两种类型:安全(S)和非安全可调用(NSC)。

3.1 安全(S)

安全地址用于只能由安全软件或安全主设备访问的内存和外设。安全事务是源自作为安全操作或被视为安全的主设备的事务,且其目标是安全地址。

3.2 非安全可调用(NSC)

NSC是一种特殊类型的安全位置。这种类型的内存是Armv8-M处理器允许容纳SG指令的唯一类型,该指令使软件能够从非安全状态过渡到安全状态。NSC内存位置的包含消除了安全软件创建者需要考虑在普通安全内存中意外包含SG指令或数据共享编码值的需要,通过将SG指令的功能限制为仅在NSC内存中。

通常,NSC内存区域包含小分支Veneers(入口点)的表。为了防止非安全应用程序跳转到无效的入口点,引入了安全网关(Secure Gateway,SG)指令。

当非安全程序调用安全端的函数时:

  • API中的第一条指令必须是一个SG指令。
  • SG指令必须位于由Security Attribution Unit(SAU)或Implementation Defined Attribution Unit(IDAU)定义的NSC区域。

引入NSC内存的原因是为了防止其他二进制数据(例如查找表)被误用作SG指令的操作码相同的入口函数,这会导致进入安全状态。通过分离NSC和安全内存类型,包含二进制数据的安全程序代码可以安全地放置在安全区域,而不会直接暴露给正常世界,并且只能使用NSC内存中的有效入口点进行访问。

3.3. 非安全(NS)

非安全地址用于由设备上运行的所有软件访问的内存和外设。非安全事务是源自作为非安全操作或被视为非安全,或从安全主设备访问非安全地址的主设备的事务。只允许非安全事务访问NS地址,并且系统必须确保NS事务被拒绝访问安全地址。