基本的世界转换流程是:
将FIQ设置为监控模式
步骤3和步骤4,在我们恢复目标上下文后, arm会触发异常进入异常 行为是否正确? (如果我们不在监视模式向量表中分支到FIQ句柄)
我们需要如下流程: (没有世界上下文切换的情况,只需进入监控模式检查我们是否需要世界切换,并直接从监控模式输入irq异常。我们需要这个因为我们的hw限制,我们的芯片中只有IRQ)
将IRQ设置为监控模式
对于非世界开关的情况,我们想让普通世界的OS不知道监控模式,只是他直接进入irq模式并从irq模式返回。 对于世界开关盒,只需将其切换到监视器模式。
或者只是在监控模式下执行irq_handle?
当量
普通世界操作系统用户模式 - > irq - > usr模式
普通世界操作系统用户模式 - >监视器到irq处理程序 - > usr模式
流程是否可行并且设计良好?
答案 0 :(得分:2)
流程是否可行并且设计良好?
有可能。 '设计精良'是主观的。它有几个失败或非理想的问题。我猜你的系统没有GIC;这是一个信任区域感知中断控制器。 GIC已经存储了寄存器,允许普通的世界操作系统(几乎)使用它,就好像它在安全的世界中一样。
您不清楚自己是否希望安全世界中断?我想从非世界转换案例的声明......'。如果您只有正常世界处理的中断,那么事情很简单。不要在IRQ(或FIQ)上分支监控模式。有一个寄存器可以设置此行为(SCR/security configuration register)。
对于双世界中断案例,您有两个问题。
您必须始终在监控模式下执行中断。监视器必须检查中断控制器源以查看中断属于哪个世界。它可能需要根据世界进行世界转换。这将增加中断延迟。同样,正常和安全的世界都将处理相同的中断控制器寄存器。所以你有恶意安全问题和非恶意竞争条件,多个中断驱动程序试图操纵寄存器(RMW)。通常,如果您的芯片没有GIC,但CPU支持TrustZone,那么您的系统在使用TrustZone时并未经过深思熟虑。 L1 / L2缓存控制器也必须能够识别TrustZone,并且您可能也会遇到问题。
如果您拥有Linux(或正常世界中的其他一些开源操作系统),最好用“虚拟”替换普通世界中断驱动程序。中断驱动程序普通的世界虚拟IRQ代码将使用SMC
指令设置虚拟寄存器并为特定中断注册IRQ例程。然后,安全的世界/监视器IRQ代码将直接分支到解码的IRQ例程。
使用GIC,使用 GICC_CTLR 组0 (安全世界)中断设置为FIQ,将组1 (正常世界)设置为IRQ >位FIQEnb
。即,您使用GIC中的DIST将中断分类为安全或正常(因此FIQ / IRQ)。
您必须解决计划问题以及您希望不同的操作系统如何抢占先机。通常(最简单)是始终运行安全的操作系统,但这意味着安全世界(RTOS)主线代码可能会延迟某些Linux(正常世界)中断。