TrustZone的IDAU接口

IDAU模块是用来表示处理器上哪些内存区域是Secure,Non-Secure Callable,Non-Secure的。通过它可以查询某个内存区域的Region Number,它还可以用来划分一个不受Secure Checking的区域,比如ROM table。不同处理器的IDAU是不尽相同的,但是在Cortex-M处理器上它还是有一定的共性的。

下图就是一个典型的IDAU的接口:

IDAU接口

理论上IDAU是可以设计为可编程的,但是受IDAU接口上的关键路径约束,可编程设计会使得IDAU的实现非常复杂,并且会显著增加SOC的Gate Count,所以一般IDAU都是提供要给简单的Memory Map,只有少量的可配置逻辑。

ARMv8-M中Memroy Map的定义是按照512MB划分的。下图的一个典型配置中,增加了按照256MB为单位的配置。

比如,设计中我们可以把[28]比特定义成是否为Secure状态,这样就可以得到如下的配置结果。

memory_map.png

注意:这个只是一个例子。

上面这样一个IDAU可以通过如下的形式产生必要的信号:

  • Secure和Non-Secure的区分是通过[28]比特来定义的
  • Secure NSC可以使用Secure Region 的标识,也就是说所有的Secure和Secure NSC不再区分,都是Non-Secure可调用的。软件必须通过内部的SAU来定义哪些区域是可调用的,这个配置必须在Non-Secure软件运行之前配置好。

非常重要的一点是只有包含有效Secure Entry Point的memroy才要配置成NSC,比如像是堆栈就不能配置成NSC,因为堆栈内部会包含大量的敏感数据。

  • Region Number可以直接用地址的[31:28]比特表示,当Memroy配置成Secure的时候,Region Number一定要唯一,因为这个Number可以用来查询内存是否连续。
  • 对于特殊的Memory Region,它的控制bit一定要置为1,比如Rom table,这样Debugger就可以正常访问这个区域,即使debugger限制在Non-Secure Only 的情况下也能正常工作。

而对于Secure的Memory是在上半部还是下半部,这个是没有限制的,但是如果处理器的启动地址限制在0x00000000,那么最好是下半部地址设置为Secure的,这样系统就可以从Secure模式启动。

对于ARMv8-M和ARMv8-M在一起共享memory map的设计,IDAU要考虑到整个系统安全设计,这种情况下,这里的例子就不能满足这种需求了。

相关文章

发表新评论