TrustZone系统

时间:2016-12-02 03:43:13

标签: caching arm cortex-a trust-zone

我遇到一些问题,我认为是关于DMA和CPU之间的一致性。这是简化的用例。

  1. Cortex A5 CPU在非安全状态下写入非安全内存。 MMU已启用,内存属性正常,可共享和可缓存。 因此,根据以下参考,数据可以在所谓的非安全高速缓存中:

    [1]"数据缓存标签数据格式"在DDI0434B_cortex_a5_mpcore_r0p1_trm

    [2] Secure mode can access secure / non secure memory how?

    中的无艺术噪音回答

    [3] http://atmel.force.com/support/servlet/fileField?id=0BEG000000002Ur

  2. 中的第6页
  3. DMA向该内存区域发出安全的连贯读取。 DMA连接到ACP。

  4. SCU只会尝试检查标记为安全的缓存。因此,根据" ACP请求"从主存储器返回数据。在DDI0434B_cortex_a5_mpcore_r0p1_trm。

  5. DMA可能会收到陈旧数据。

  6. 如果我的描述是正确的,这是我的第二个问题。 哪个行动可以解决这个问题?

    1)在DMA读取之前明确清理缓存

    2)将内存的属性更改为普通,可共享和不可缓存。

    此外,TRM表示存在一个写缓冲区,用于在高速缓存驱逐或不可缓存的写突发中保存数据,然后将它们写入"总线接口单元和SCU接口"中的SCU接口。 。但是,无法找到有关写缓冲区的更多信息。我可以假设写缓冲区有一些魔力来确保一致性吗?如果有人能解释这种魔力,我会非常感激。

    考虑到更多组合,我自己拿到这张桌子。

     CPU state |   Memory   | DMA access | Result    
    -----------+------------+------------+-----------+    
    non-secure | non-secure | non-secure | OK            
    non-secure | non-secure |   secure   | NG    
    non-secure |   secure   |     -      | NA    
    secure     | non-secure | non-secure | OK    
    secure     | non-secure |   secure   | NG (Same reason as the second case)
    secure     |   secure   | non-secure | NA    
    secure     |   secure   |   secure   | OK
    

    第一列显示CPU写入内存的状态。

    第二列显示内存是否安全。在这里"安全"意味着如果AxPROT [1]为高,AXI将拒绝访问。内存属性是正常的,可共享的和可缓存的。

    第三列显示了哪种访问DMA问题。访问是连贯的。

    第四栏说明会发生什么。

    NG意味着DMA可能会收到过时的数据。

    NA表示无法访问。

    OK表示DMA与CPU保持一致。

    是对吗?

    我根据Notlikethat的回答添加了这部分内容。在实践中这可能是一场噩梦。但是我想知道理论上会发生什么。

    1. 假设物理地址0x10映射到两个虚拟地址,NS:0x110和S:0x210。
    2. 处于安全状态的CPU将值0x110写入NS:0x110,然后将值0x210写入S:0x210。
      所以两者可能同时在L1缓存中,对吧?
    3. 然后DMA1对PA 0x10进行安全读取,并可能获得0x210。 DMA2对PA 0x10进行非安全读取,可能会得到0x110。
    4. 在那之后,最终将在主存中的哪一个是不可预测的。
    5. 请确认或更正我的理解。非常感谢。

1 个答案:

答案 0 :(得分:1)

在架构上,您无法安全访问非安全内存"。安全和非安全的物理地址空间是独立的(许多支持TrustZone的系统具有出现在不同地址以保护安全与非安全访问的内容)。但实际上,很多外围设备(包括内存控制器)都不能识别TrustZone,因此大多数系统都在TZASC后面,此时安全和非安全地址空间在很大程度上重叠。

在CPU上,安全软件通过设置了NS位的页表条目,或者通过设置了SCR.NS的监控模式访问非安全存储器;在这两种情况下,生成的总线访问都设置了AxPROT [1],即它是非安全访问。如果您希望外设正确访问非安全内存,则需要以类似的方式发出非安全访问。

否则,您所拥有的是物理别名更普遍的问题,除非绝对必要,否则通常不推荐使用 - 更传统的例子是具有相当高物理地址的DRAM的系统(例如0x80000000,甚至高于32)具有LPAE功能的系统上的位,其中一部分是低位别名(例如,引脚向量为0x0),直到MMU建立为止。即使是物理标记的高速缓存也不知道0x0和0x80000000实际上最终位于互连的另一端的同一位置,所以如果你要同时使用它们,你确实会有一个超出范围的一致性噩梦。该体系结构,只能通过显式缓存维护进行管理。

以同样的方式,一个TrustZone感知缓存,包括作为物理地址标记的一部分的安全状态,不知道S:0x80000000和NS:0x80000000实际上可能最终在您的特定系统上的相同位置(一般情况下,它们可能不会),所以再次说明,除非手动管理,否则两个地址不一致 - 写入一个别名的数据必须从缓存中清除到TZASC之外的点(通常一直到DRAM)它从另一个可见。请注意,如果您的Cortex-A5系统具有外部L2缓存(如PL310),则表示通过VA将CPU缓存清理为PoC,然后根据需要通过安全/非安全访问清除L2,这可能都是必须的仅由安全世界完成以避免同步问题。理论上,通过迫使所有数据通过DRAM进行往返,一切都使得不可缓存的访问将解决一致性问题,尽管某些外部缓存配置仍然不会妨碍它。最好让DMA控制器直接在适当的时候发出非安全访问,这样你就可以从缓存中实际受益而不是与它们作斗争。