Linux 在非SecureOS和trustzone系统中SecureOS中直接访问内存的过程是如何工作的

Linux 在非SecureOS和trustzone系统中SecureOS中直接访问内存的过程是如何工作的,linux,arm,cpu-cache,trust-zone,Linux,Arm,Cpu Cache,Trust Zone,我不确定我是否理解ARM处理器中CPU直接访问内存的全部流程, 我想知道缓存L1和L2、DMA和MMUor安全MMU参与了内存访问的哪一部分。 我不确定我是否理解将数据从非secureOS发送到secureOS的过程从通过DMA分配共享缓冲区开始,然后将数据写入secureOS和非secureOS之间的共享缓冲区并发送 其他问题: 为什么DMA需要在安全或非安全之间通信?为什么不能通过内核缓冲区kmalloc、kzalloc、get_page等来使用呢。? 一般来说,有可能CPU访问内存没有DM

我不确定我是否理解ARM处理器中CPU直接访问内存的全部流程, 我想知道缓存L1和L2、DMA和MMUor安全MMU参与了内存访问的哪一部分。 我不确定我是否理解将数据从非secureOS发送到secureOS的过程从通过DMA分配共享缓冲区开始,然后将数据写入secureOS和非secureOS之间的共享缓冲区并发送

其他问题:

为什么DMA需要在安全或非安全之间通信?为什么不能通过内核缓冲区kmalloc、kzalloc、get_page等来使用呢。? 一般来说,有可能CPU访问内存没有DMA?DMA必须参与吗? CPUcache L1或L2与DMA之间可能没有一致性? 例如: 非secureOS将自己的数据写入DMA缓冲区并发送到secureOS。 secureOS接收缓冲区,非secureOS在不刷新的情况下再次更改缓冲区我认为更改保留在缓存中,最后secureOS从缓存中读取过时的伪数据
TrustZone的所有功能都是通过扩展总线的“NS”位来完成的。 对于信任区CPU,通过MMU的L1/L2/TLB需要知道“NS”位。缓存和TLB增加了一个“NS”位,如果“NS”是清除的,则无法从正常世界访问

我不确定我是否理解将数据从非secureOS发送到secureOS的过程从通过DMA分配共享缓冲区开始,然后将数据写入secureOS和非secureOS之间的共享缓冲区并发送

安全/非安全操作系统有几种通信方式。DMA缓冲区是一种方式,但它可能很复杂,不是正常模式。最基本的机制是SMC指令。这被监视器模式捕获,并完成与“系统调用”相同的任务

另一种方法是将RAM映射为世界共享。通常,这是通过TZASC完成的,但系统上可能存在其他信任区内存控制器。这可能是通过smc机制“引导”的最佳方式

使用DMA控制器可以扩展全球共享内存缓冲区,以减轻CPU的工作负载。然而,我认为这个病例有点病态,永远不会发生。比通过DMA复制内存更快的是更新TZASC以使缓冲区可共享。没有复制

正常世界读取“安全内存”->故障。 正常世界读取“世界共享内存”->按正常访问。 如果设备未启动锁定,安全操作系统可以在运行时翻转TZASC权限

为什么DMA需要在安全或非安全之间通信?为什么不能通过内核缓冲区kmalloc、kzalloc、get_page等来使用呢

如上所述。它需要世界共享内存

一般来说,有可能CPU访问内存没有DMA?DMA必须参与吗

没有DMA根本不需要参与。事实上,我想知道是什么让你这么想的

CPUcache L1或L2与DMA之间可能没有一致性?例如:非secureOS将自己的数据写入DMA缓冲区并发送到secureOS。secureOS接收缓冲区,非secureOS在不刷新的情况下再次更改缓冲区我认为更改保留在缓存中,最后secureOS从缓存中读取过时的伪数据

DMA和缓存始终存在一致性问题。TrustZone没有添加任何新内容。如果您使用的是DMA,则需要将MMU设置为设备内存,并且不会对其进行缓存

此外,DMA设备本身被视为总线主设备。它们可以是信任区感知的,也可以是一些前端逻辑。在第一种情况下,控制器根据记录的使用模式翻转“NS”位。例如,加密设备可以向正常/安全世界提供银行寄存器。根据谁访问了设备,DMA将在NS设置或清除的情况下执行。对于第二种情况,另一个设备/垫圈为DMA设置固定访问。它始终是正常或安全访问。这通常是启动锁定


DMA和CPU之外的所有硬件都在CPU的范围之外。SOC设计者和OEM必须配置系统以满足应用程序的安全要求。因此,如果需要,不同的设备应映射到正常/安全或动态。最安全的情况是修复这些映射并在引导时锁定它们。否则,您的攻击面将在针对TrustZone的攻击中增长。

启动锁定是寄存器库中的一个位/字段,它将禁用对该库的写入。启动时很清楚,一旦设置“锁定”寄存器。每个世界都有缓存条目。它只能在可访问的情况下将其放入缓存。所以,更改为世界可写应该至少在最初不会影响缓存;但换回来也有风险。普通缓存需要刷新这些行。缓存刷新等在动态情况下最为复杂。因为这个原因,“世界可写” e'区域通常是固定的,而不是动态的。