基本的世界切换流程是:
将FIQ设置为监控模式
- normal world -> FIQ triggered
- -> 进入监控模式(切换到安全世界,恢复安全世界上下文)
- -> 在安全世界系统模式下
- -> FIQ不清楚,进入Secure world中的FIQ handler
步骤3和步骤4,在我们恢复目标上下文之后,
arm会触发异常进入异常
行为正确吗? (如果我们不分支到监控模式向量表中的 FIQ 句柄)
我们需要如下所示的流程:
(没有世界上下文切换情况,只需进入监视器模式检查是否需要世界切换,然后直接从监视器模式进入IRQ异常。我们需要这个,因为我们的硬件限制,我们的芯片中只有IRQ)
将 IRQ 设置为监视模式
- normal world user mode -> IRQ triggered
- -> 进入monitor,做一些我们想要hook的事情,检查我们是否需要上下文切换,为IRQ模式准备一些spsr/lr
- -> 进入正常世界IRQ模式,IRQ处理
- -> irq完成,返回用户模式
对于非世界切换情况,我们想让正常世界操作系统不知道监视器模式,尽管他直接进入IRQ模式并从IRQ模式返回。
对于世界切换情况,只需在监控模式下切换即可。
或者只是在监视模式下执行 irq_handle ?
eq.
正常世界操作系统 usr 模式 -> irq -> usr 模式
正常世界操作系统 usr 模式 -> 监视 irq 处理程序 -> usr 模式
流程是否可行且设计良好?
流程是否可行且设计良好?
有可能的。 “精心设计”是主观的。它有几个失败或不理想的问题。我猜你的系统没有GIC;这是一个信任区感知中断控制器。 GIC 拥有存储寄存器,允许正常世界操作系统(几乎)像在安全世界中一样使用它。
您的问题并不清楚您是否希望安全世界有中断?我从“对于非世界开关情况......”的陈述中猜想。如果只有正常世界处理的中断,事情就很简单。不要在 IRQ(或 FIQ)上分支到监视模式。有一个寄存器可以设置此行为(SCR/安全配置寄存器).
对于双重世界中断情况,您有两个问题。
- 您需要信任正常世界的操作系统。
- 中断延迟将会增加。
您必须始终在监视模式下接收中断。监视器必须检查中断控制器源以查看中断属于哪个世界。它可能需要根据世界进行世界切换。这将增加中断延迟。同样,正常世界和安全世界都将处理相同的中断控制器寄存器。因此,您会遇到恶意安全问题和非恶意竞争条件,多个中断驱动程序试图操纵寄存器(RMW)。一般来说,如果您的芯片没有 GIC,但 CPU 支持 TrustZone,则说明您的系统尚未充分考虑使用 TrustZone。 L1/L2 缓存控制器也必须能够识别 TrustZone,并且您也可能在那里遇到问题。
如果您有 Linux(或正常世界中的其他开源操作系统),最好用“虚拟”中断驱动程序替换正常世界中断驱动程序。正常世界的虚拟 IRQ 代码将使用SMC
为特定中断设置虚拟寄存器和寄存器 IRQ 例程的指令。然后,安全世界/监视器 IRQ 代码将直接分支到解码的 IRQ 例程。
使用 GIC,设置group 0(安全世界)中断为 FIQ 和group 1(正常世界)作为 IRQ 使用GICC_CTLR bit FIQEnb
。即,您可以使用 GIC 中的 DIST 将中断分类为安全中断或正常中断(因此也称为 FIQ/IRQ)。
您必须解决调度问题以及您希望不同操作系统如何抢先。通常(最简单)是始终运行安全操作系统,但这意味着某些 Linux(正常世界)中断可能会被安全世界(RTOS)主线代码严重延迟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)