1

基本的世界切换流程是:

将 FIQ 设置为监控模式

  1. 正常世界 -> FIQ 触发
    1. -> 进入监控模式(切换到安全世界,恢复安全世界上下文)
    2. -> 在安全世界系统模式下
    3. -> FIQ 不清楚,在 Secure world 中输入 FIQ 处理程序

step3和step4,我们恢复目标上下文后,arm会触发异常进入异常行为是否正确?(如果我们不在监控模式向量表中分支到 FIQ 句柄)

我们需要如下流程:(没有世界上下文切换的情况,只需进入监控模式检查是否需要世界切换,然后直接从监控模式进入irq异常。由于我们的硬件限制,我们需要这个,我们的芯片中只有IRQ )

将 IRQ 设置为监控模式

  1. 普通世界用户模式 ​​-> IRQ 触发
    1. -> 进入monitor,做我们想hook的事情,检查是否需要上下文切换,为IRQ模式准备一些spsr/lr
  2. -> 进入普通世界IRQ模式,irq处理
  3. -> irq 完成,返回用户模式

对于non-world switch的情况,我们想让正常的world os不知道monitor mode,尽管他直接进入irq mode并从irq mode返回。对于世界开关盒,只需在监控模式下切换即可。

还是只是在监控模式下执行 irq_handle?

等式。
普通世界 OS usr 模式 -> irq -> usr 模式
普通世界 OS usr 模式 -> 监控到 irq 处理程序 -> usr 模式

流程是否可行且设计良好?

4

1 回答 1

3

流程是否可行且设计良好?

有可能的。“精心设计”是主观的。它有几个失败或不理想的问题。我猜你的系统没有GIC;这是一个信任区感知中断控制器。GIC 有银行寄存器,允许普通世界操作系统(几乎)使用它,就好像它在安全世界中一样。

您的问题不清楚您是否希望安全世界有中断?我猜来自'for non-world switch case ...'的声明。如果你只有正常世界处理的中断,事情就很简单了。不要分支到 IRQ(或 FIQ)上的监视模式。有一个寄存器可以设置这种行为(SCR/安全配置寄存器)。

对于双重世界中断情况,您有两个问题。

  1. 您需要信任普通世界的操作系统。
  2. 中断延迟会增加。

您必须始终在监视模式下接受中断。监视器必须检查中断控制器源以查看中断属于哪个世界。它可能需要根据世界进行世界切换。这将增加中断延迟。同样,正常世界和安全世界都将处理相同的中断控制器寄存器。所以你有恶意的安全问题和非恶意的竞争条件,多个中断驱动程序试图操纵寄存器 (RMW)。一般来说,如果你的芯片没有 GIC,但 CPU 支持 TrustZone,那么你的系统就没有考虑好使用 TrustZone。L1/L2 缓存控制器也必须支持 TrustZone,并且您也可能在那里遇到问题。

如果您有 Linux(或普通世界中的其他一些开源操作系统),最好用“虚拟”中断驱动程序替换普通世界的中断驱动程序。正常世界的虚拟 IRQ 代码将使用该SMC指令来设置虚拟寄存器并为特定中断注册 IRQ 例程。然后,安全世界/监视器 IRQ 代码将直接分支到解码的 IRQ 例程。


对于 GIC,使用GICC_CTLR位将第0 组(安全世界)中断设置为 FIQ,将第 1 组(正常世界)中断设置为 IRQ 。即,您使用 GIC 中的 DIST 将中断分类为安全或正常(因此是 FIQ/IRQ)。FIQEnb

您必须解决调度问题以及您希望不同操作系统如何抢占。通常(最简单的)是始终运行安全操作系统,但这意味着某些 Linux(正常世界)中断可能会被安全世界 (RTOS) 主线代码非常延迟。

于 2016-12-20T14:25:22.350 回答