TrustZone 的一切都是通过增加 BUS 的“NS”位来完成的。对于 TrustZone CPU,L1/L2/TLB(通过 MMU)需要注意“NS”位。缓存和 TLB 增加了一个“NS”位,如果“NS”是明确的,则无法从正常世界访问。
我不确定我是否理解从 non-secureOS 向 SecureOS 发送数据的过程是从通过 DMA 分配共享缓冲区并将数据写入共享缓冲区(在 secureOS 和 non-secureOS 之间)和发送开始的。
安全/非安全操作系统有多种通信方式。DMA 缓冲区是一种方式,但它可能很复杂并且不是正常模式。最基本的机制是SMC
指令。这被监控模式捕获并完成与“系统调用”相同的事情。
另一种方法是将 RAM 映射为全球共享。通常,这是通过 TZASC 完成的,但系统上可能存在其他 Trustzone 内存控制器。这可能是通过机制最好的“引导” smc
。
使用 DMA 控制器可以扩展全球共享内存缓冲区以减轻 CPU 工作负载。但是,我认为这个案子有点病态,永远不会做。甚至比通过 DMA 复制内存更快的是更新 TZASC 以使缓冲区可共享。没有复制。
- 正常世界读取“安全内存”-> 故障。
- 普通世界读取“世界共享内存”->正常访问。
如果设备未启动锁定,则安全操作系统可以在运行时翻转 TZASC 权限。
为什么 DMA 需要在安全或非安全之间进行通信?为什么不能通过内核缓冲区(kmalloc()、kzalloc()、get_page() 等)使用?
如上所述。它需要世界可共享的内存。
通常,CPU 可以在没有 DMA 的情况下访问内存吗?DMA必须参加吗?
没有 DMA 根本不需要参与。事实上,我想知道是什么让你认为是这种情况?
CPU(缓存 L1 或 L2)与 DMA 之间可能没有一致性?例如:non-secureOS 将自己的数据写入 DMA 缓冲区并发送到 secureOS。安全操作系统接收缓冲区,非安全操作系统再次更改缓冲区而不刷新(我认为更改保留在缓存中),最后安全操作系统从缓存中读取陈旧的假数据
DMA 和缓存总是存在一致性问题。TrustZone 没有添加任何新内容。如果您使用 DMA,则需要将 MMU 设置为设备内存,并且不会缓存。
此外,DMA 设备本身也被视为 BUS 主机。如果放置在它们上面,它们可以是 TrustZone 感知的或一些前端逻辑。在第一种情况下,控制器根据记录的使用模式翻转“NS”位。例如,加密设备可能会向正常/安全世界提供存储的寄存器。根据访问设备的人员,DMA 将在 NS 设置或清除的情况下执行。对于第二种情况,另一个设备/垫片为 DMA 设置了固定访问。它始终是正常访问或安全访问。这通常是引导锁定的。
DMA(以及除 CPU 之外的所有硬件)不在 CPU 的范围内。SOC 设计者和 OEM 必须配置系统以匹配应用程序的安全要求。所以不同的设备应该映射到正常/安全(或动态,如果需要)。最安全的情况是修复这些映射并在启动时锁定它们。否则,您的攻击面会随着对 TrustZone 的攻击而扩大。