arm信任区监控模式开关设计

arm信任区监控模式开关设计,arm,trust-zone,Arm,Trust Zone,基本的世界切换流程是: 将FIQ设置为监控模式 正常世界->触发FIQ ->进入监控模式(切换到安全世界,恢复安全世界上下文) ->在安全世界系统模式下 ->FIQ不清楚,请在安全世界中输入FIQ处理程序 步骤3和步骤4,在我们恢复目标上下文之后, arm将触发异常以输入异常 这种行为正确吗?(如果我们不在监视器模式向量表中分支到FIQ句柄) 我们需要如下流程: (无世界上下文切换情况,只需进入监控模式检查是否需要世界切换,并直接从监控模式输入irq异常。由于我们的硬件限制,我们需要这个,我们

基本的世界切换流程是:

将FIQ设置为监控模式

  • 正常世界->触发FIQ
  • ->进入监控模式(切换到安全世界,恢复安全世界上下文)
  • ->在安全世界系统模式下
  • ->FIQ不清楚,请在安全世界中输入FIQ处理程序
  • 步骤3和步骤4,在我们恢复目标上下文之后, arm将触发异常以输入异常 这种行为正确吗?(如果我们不在监视器模式向量表中分支到FIQ句柄)

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

    将IRQ设置为监视模式

  • 正常世界用户模式->IRQ触发
  • ->进入monitor,做一些我们想挂接的事情,检查是否需要上下文切换,为IRQ模式准备一些spsr/lr
  • ->进入正常世界IRQ模式,IRQ处理
  • ->irq完成,返回用户模式
  • 对于非世界切换情况,我们希望让普通世界操作系统不知道监视器模式,尽管他直接进入irq模式并从irq模式返回。 对于world switch案例,只需在监视器模式下切换即可

    或者只是在监控模式下处理irq_

    等式
    正常世界操作系统usr模式->irq->usr模式
    正常世界操作系统usr模式->监视器到irq处理程序->usr模式

    流量是否可能,井设计是否合理

    流量是否可能,井设计是否合理

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

    你的问题不清楚你是否希望安全的世界有中断?我从“对于非世界开关情况…”的陈述中猜测。如果只有正常世界处理的中断,事情就简单了。不要在IRQ(或FIQ)上切换到监控模式。有一个寄存器可以设置此行为()

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

  • 你需要相信正常的操作系统
  • 中断延迟将增加
  • 您必须始终在监视器模式下进行中断。监视器必须检查中断控制器源,以查看中断属于哪个世界。它可能需要根据世界进行世界切换。这将增加中断延迟。同样,正常和安全世界都将处理相同的中断控制器寄存器。因此,当多个中断驱动程序试图操纵寄存器(RMW)时,您会遇到恶意安全问题和非恶意竞争条件。一般来说,如果您的芯片没有GIC,但CPU支持TrustZone,那么您的系统在TrustZone使用方面没有经过充分考虑。一级/二级缓存控制器还必须具有信任区意识,并且您可能也存在此问题

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


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


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

    如果您引用了您正在使用的特定SOC(并提供了指向参考PDF的链接),可能会有所帮助?这是一种不受欢迎的SOC。在我们的开发环境中,GIC只有与arm核心的IRQ连接,没有FIQ。我们希望在每个世界运行两个操作系统。Linux在普通世界,rtos在安全世界。两个操作系统都有单独的中断,基本上我们希望它们单独运行。ARM有一个推荐的设计,IRQ为正常世界FIQ为正常世界切换为安全世界。但我们只有IRQ,所以我们需要寻找是否有任何好的解决方案来解决IRQ唯一的情况。我相信“组0”中断是FIQ,“组1”是IRQ。也就是说,您将GIC中DIST的中断分类为安全或正常(因此FIQ/IRQ)。文件不清楚“组0”和“组1”的含义(参见GICD_IGROUPR和GICC_CTLR w.bit
    FIQEnb
    )。您可能需要重新编写一些RTOS代码,尤其是独立的系统计时器。此外,Linux中的任何“pinctrl”都需要与RTO同步(出于安全和竞争原因)。非常感谢,我理解。我还将检查SoC中GIC状态的FIQ。术语“FIQn”是一条物理线。您的硬件可能没有此功能。明确地说,常规中断源可以路由到IRQ或FIQ。我记得,GICC_CTRL.FIQEnb将导致组0全部为FIQ,但对于GIC的某些版本可能会有所不同。这是一种不受欢迎的SOC。在我们的开发环境中,GIC只有与arm核心的IRQ连接,没有FIQ。我们希望在每个世界运行两个操作系统。Linux在普通世界,rtos在安全世界。两个操作系统都有单独的中断,基本上我们希望它们单独运行。ARM有一个推荐的设计,IRQ为正常世界FIQ为正常世界切换为安全世界。但我们只有IRQ,所以我们需要寻找任何IRQ