baron · 3月28日 · 四川

optee中断处理的介绍(概念篇)

快速连接

👉👉👉【精选】ARMv8/ARMv9架构入门到精通-目录 👈👈👈


 title=

本节介绍optee_os如何根据SMC异常和中断通知处理世界执行上下文的切换。中断通知是 IRQ/FIQ 异常,这也可能意味着世界执行上下文的切换:正常世界到安全世界,或安全世界到正常世界。

world context switch的用例

本节列出了 OP-TEE OS 参与世界上下文切换的所有情况。Optee_os 在安全世界中执行。世界切换由核心的安全监视器级别/模式完成,以下称为Monitor。

当正常世界调用安全世界时,正常世界执行 SMC 指令。SMC 异常始终由监视器捕获。如果相关服务以可信操作系统为目标,则监视器将切换到 OP-TEE 操作系统世界执行。当安全世界返回正常世界时,OP-TEE OS 执行一个 SMC,该 SMC 被监视器捕获,监视器切换回正常世界。

当 Arm GIC 发出安全中断信号时,它将到达 OP-TEE OS 中断异常向量。如果安全世界正在执行,OP-TEE OS 将直接从其异常向量处理中断。如果安全中断引发时正常世界正在执行,则监视器向量必须处理异常并调用 OP-TEE 操作系统来服务中断。

当 Arm GIC 发出非安全中断信号时,它将到达正常的世界中断异常向量。如果正常世界正在执行,它将直接处理来自其异常向量的异常。如果在非安全中断引发时安全世界正在执行,OP-TEE OS 将通过监视器暂时返回正常世界,让正常世界为中断服务。

异常(中断)向量

监视器向量VBAR_EL3位于 AArch64 和MVBARArmv7-A/AArch32 中。在正常世界或安全世界正在执行时可以访问监视器。正在执行的安全状态通过SCR_NS.

可以从 SMC 异常、IRQ 或 FIQ 异常(所谓的中断)和异步中止访问监视器。显然,监视器中止(数据、预取、未定义)是监视器执行的本地操作。

监视器可以在 OP-TEE 操作系统的外部(案例<font color=red size=4> CFG_WITH_ARM_TRUSTED_FW=y</font>)。如果没有,则提供本地安全监视器core/arch/arm/sm。<font color=blue size=4> Armv7-A 平台应使用 OP-TEE OS 安全监视器。Armv8-A 平台可能依赖Trusted Firmware A</font>。

在监视器外执行时,系统要么在正常世界 ( SCR_NS=1) 中执行,要么在安全世界 ( SCR_NS=0) 中执行。每个世界都有自己的异常向量表(状态向量):

  • VBAR_EL2或者VBAR_EL1非安全或VBAR_EL1安全的AArch64。
  • HVBAR或者VBAR非安全或VBAR安全对ARMv7-A和AArch32。

所有 SMC 异常都被捕获在监视器向量中。IRQ/FIQ 异常可以被捕获在监视器向量或执行世界的状态向量中。

当正常世界执行时,系统配置为路由:

  • 对将转发到 OP-TEE OS 的监视器的安全中断
  • 对正在执行的世界异常向量的非安全中断。

当安全世界正在执行时,系统配置为路由:

  • 对正在执行的 OP-TEE 操作系统异常向量的安全和非安全中断。OP-TEE OS 应将非安全中断转发到正常世界。
  • Optee_os 非安全中断总是被困在执行世界的状态向量中。这由 的静态值反映SCR_(IRQ|FIQ)。

Native and foreign interrupts

从 OP-TEE OS 的角度定义了两种类型的中断。

  • Native 中断- 由 OP-TEE OS 处理的中断、针对 S-EL1 或安全特权模式的安全中断
  • foreign 中断- OP-TEE OS 未处理的中断、针对正常世界的非安全中断或针对 EL3 的安全中断。

对于 Arm GICv2模式,本地中断通过 FIQ 发出信号,外部中断通过 IRQ 发出信号。对于 Arm GICv3模式,外部中断作为 FIQ 发出信号,可由安全世界(aarch32 监控模式或 aarch64 EL3)或正常世界处理。

可以通过设置启用 Arm GICv3 模式CFG_ARM_GICV3=y。本机中断必须安全地路由到 OP-TEE 操作系统。在安全世界执行期间被困的外部中断可能需要有效地路由到正常世界。

IRQ 和 FIQ 在正常世界中保持其含义,因此为清楚起见,我们将继续在正常世界上下文中使用这些名称。

Normal World 使用 SMC 调用 OP-TEE OS

进入安全监视器

监视器管理安全世界的所有入口和出口。为了从正常世界进入安全世界,监视器保存正常世界的状态(通用寄存器和未存储的系统寄存器)并恢复以前的安全世界状态。然后执行从异常返回并恢复恢复的安全状态。从安全世界退出到正常世界则相反。

一些通用寄存器在进入和退出时不会保存和恢复,它们用于在安全世界和普通世界之间传递参数(详细信息请参见 ARM_DEN0028A_SMC_Calling_Convention)。

Trusted OS 的进入和退出

在进入和退出 Trusted OS 时,每个 CPU 都使用单独的入口堆栈并在 IRQ 和 FIQ 屏蔽的情况下运行。SMC 分为两种类型:fast 和 yielding。

  • 对于 fast SMCs,OP-TEE OS 将在 entry stack上执行,并屏蔽 IRQ/FIQ,直到执行返回到正常世界。
  • yielding SMCs,OP-TEE OS 将在某个时候执行请求的服务,并且中断未屏蔽。为了处理中断,主要是外来中断的转发,OP-TEE OS为SMC请求分配了一个可信线程(core/arch/arm/kernel/thread.c)。受信线程存储所请求服务的执行上下文。当请求的服务执行和被中断时,这个上下文可以被挂起和恢复。只有在服务执行返回完成状态时才释放受信任线程。
    为了产生SMC,OP-TEE OS 分配或恢复受信任的线程,然后取消屏蔽 IRQ 和 FIQ 线。当 OP-TEE OS 需要从外部中断或远程服务调用调用正常世界时,OP-TEE OS 会屏蔽 IRQ 和 FIQ 并挂起受信任的线程。挂起时,OP-TEE OS 返回到入口堆栈。
  • 这两个快速产生的SMC结束与IRQ和FIQ进入堆栈蒙面OP-TEE OS将调用监控通过SMC返回到正常的世界。
  • fast 和yielding SMCs在进入optee时的entry stack上,IRQ 和 FIQ都是屏蔽的。OP-TEE OS通过调用smc进入Monitor再返回normal world。

在这里插入图片描述


关注"Arm精选"公众号,备注进ARM交流讨论区。
图片1.png

推荐阅读
关注数
9437
内容数
191
以易懂、渐进、有序的方式,深入探讨ARMv8/ARMv9架构的核心概念。我们将从基础知识开始,逐步深入,覆盖最新的架构,不再纠缠于过时技术。本系列内容包含但不限于ARM基础、SOC芯片基础、Trustzone、gic、异常和中断、AMBA、Cache、MMU等内容,并将持续更新。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息