上下文切换到安全模式的成本是多少(arm trustzone)

What is cost of context switching to secure mode (arm trustzone)

我想了解在 arm 的可信(安全)和非安全模式之间来回切换的成本。

从非安全世界转移到安全世界时究竟需要发生什么?我知道需要设置 ns 位(基于某些特殊指令?),需要刷新和更新页表(?),刷新和更新处理器缓存。还有什么需要发生的吗?

处理器缓存:它们是分段和共享缓存,还是每个模式都使用整个缓存?这决定了开关的成本。

RAM:这必须是 'partitioned' 并且被两种模式使用。所以寻址只是 'partition' 的一个偏移量。这样对吗?

这与用户 space 到内核模式切换或用户 space 中的进程到进程切换有什么不同?

从非安全模式转移到安全模式时,是否有什么会使其比常规进程上下文切换更昂贵?

是否有任何文章可以解释到底发生了什么?

编辑:根据下面的回复,我希望了解当进程在 arm 处理器上从非安全模式切换到安全模式(信任区)时到底发生了什么。

What exactly needs to happen when moving from non-secure to secure world?

TL-DR;最小值是 save/restore 所有 CPU 安全世界所需的寄存器并更改 NS 位。通常,R0-R14 以及当前模式和存储的 LR 和 SP(中止、中断等)都在这个寄存器组中。其他一切都取决于您的安全模型。


首先,TrustZone 中可以使用许多不同的模型; TrustZone 是一种工具而非解决方案。最基本的模型是一个带有 API 的库,其中存储了一些安全数据(即解密密钥)以供外部源处理(一些 DRM 从 'normal world' space 下载)。我想你不是这个意思。

一个OS可以是可抢占的和不可抢占的。如果你在两个世界中都有两个 OSes,那么如何放弃控制、共享资源和保护安全资产都将在世界切换时发挥作用。

在许多情况下,缓存和 TLB 是世界感知的。设备也可以是世界感知的,并且设计的目的是将上下文内置到设备中。这并不是说某些系统可能会以某种方式泄露信息。

如果您真的担心这种类型的攻击,将安全世界内存标记为需要保护的非缓存可能是合适的。在许多 ARM 系统中,L1/L2 和 TLB 缓存在世界之间是统一的,可以提供侧信道攻击。

许多 ARM 设备上实现的 TrustZone 带有一个 GIC,它可以 运行 安全世界中的 FIQ,并且可以防止在正常世界中屏蔽 FIQ。许多 GIC 功能在世界之间存储,允许 OS 两个人在没有 'context switch' 信息的情况下使用它。即,NS 位将根据 NS 位的状态自动更改访问的 GIC 功能(因此它具有存储在设备中的上下文)。许多其他特定于供应商的设备被设计为以这种方式运行。

如果两个世界都使用NEON/VFP,那么你也需要save/restore在一个世界开关上注册这些。对于抢占,您可能需要挂接到 OS 安全调度程序以允许正常世界中断抢占安全世界主线(显然这取决于您要保护的资产;如果您允许这个安全主线有一个 DOS 向量)。

如果设备出现故障,您可能需要 save/restore 设备状态。如果普通世界被限制使用FIQ模式,那么去普通世界时至少还是需要清除SP_fiq和LR_fiq(反之恢复secure值)。其中一些寄存器很难 save/restore,因为您必须切换模式,如果不小心,这本身就是一个安全风险。

RAM: This must be 'partitioned' and used by both modes. So addressing is just an offset into the 'partition'. Is this right?

安全启动将根据 'NS bit' 对内存进行分区。物理内存是否可见取决于通常可以在启动时锁定的分区管理器设备逻辑。即,如果不可见,它就像任何不存在的内存一样是总线错误。 NS位旁边没有'switch'

Is there anything in moving from non-secure to secure modes that would make it more expensive than the regular process context switch?

是的,普通开关仅适用于 'mode'。一个世界适用于所有 ARM 模式,因此必须切换所有分组寄存器。根据系统的不同,TLB 和缓存通常不需要切换。


相关: