ARMv7 SMC OPTEE 切换中的SCR寄存器的NS,FIQ,EA bit状态

在 OP-TEE 适配 ARMv7 的 SMC 代码中,当处理来自 Non-Secure World(非安全世界) 的请求时,进入 smc_from_nsec 时需要将 SCR(Secure Configuration Register)NS(bit 0)FIQ(bit 2) 位设置为 0,这是为了确保以下关键安全性和稳定性需求:


1. 确保处理器处于 Secure 状态

  • NS 位(bit 0)
    • NS = 1:处理器处于 Non-Secure 状态。
    • NS = 0:处理器处于 Secure 状态。
    • 目的
      在处理 SMC 请求时,必须确保处理器处于 Secure 状态,以防止非安全代码访问安全资源或破坏安全上下文。
      • 为什么设置 NS=0
        当 Non-Secure 代码调用 SMC 指令时,处理器会切换到 Monitor 模式(由 SCR 控制)。ATF(ARM Trusted Firmware)在处理完上下文切换后,会调用 OP-TEE 的 smc_from_nsec。此时,若不将 NS 位设置为 0,处理器可能仍处于 Non-Secure 状态,导致安全逻辑失效(如 TA 无法正确运行)。

2. 禁用 FIQ 中断进入 Monitor 模式

  • FIQ 位(bit 2)
    • FIQ = 1:FIQ 异常触发时,处理器进入 Monitor 模式(而非 FIQ 模式)。
    • FIQ = 0:FIQ 异常触发时,处理器进入 FIQ 模式(Non-Secure 状态)。
    • 目的
      在处理 SMC 请求时,需 暂时屏蔽 FIQ 中断进入 Monitor 模式,以避免中断处理与当前的安全操作冲突。
      • 为什么设置 FIQ=0
        如果 FIQ 位保持为 1,当 Secure 世界处理 SMC 请求时,若发生 FIQ 中断,处理器会再次进入 Monitor 模式,导致复杂的上下文切换和潜在的竞态条件。通过设置 FIQ=0,FIQ 中断会直接进入 FIQ 模式(Non-Secure 状态),从而避免干扰 Secure 世界的执行流程。

3. 遵循 ARM 架构的安全协议

  • ARM TrustZone 要求
    在进入 Secure 状态处理 SMC 请求时,必须确保以下配置:

    1. NS=0:明确标识当前处于 Secure 状态。
    2. FIQ=0:禁用 FIQ 中断进入 Monitor 模式。
    3. EA=1(bit 3):启用外部中止(External Abort)进入 Monitor 模式(通常保留为 1)。

    示例配置

    SCR &= ~(1 << 0);  // NS=0 (Secure 状态)
    SCR &= ~(1 << 2);  // FIQ=0 (FIQ 中断进入 FIQ 模式)
    

4. 防止中断嵌套和上下文切换的开销

  • 上下文切换的代价
    • 若 FIQ 位未设置为 0,Secure 世界处理 SMC 请求时可能发生 FIQ 中断,触发 Monitor 模式切换。
    • 后果
      • 增加上下文保存/恢复的开销。
      • 可能导致中断嵌套(Nested Interrupts),破坏 SMC 请求的原子性。
    • 解决方案
      通过设置 FIQ=0,确保 FIQ 中断不会中断 Secure 世界的执行流程,从而避免嵌套和性能损耗。

5. 实际代码中的体现

在 OP-TEE 的 smc_from_nsec 中,SCR 的修改通常通过汇编指令实现。例如:

// 保存当前 SCR 值
mrc p15, 0, r0, c1, c1, 0  // 读取 SCR 到 r0

// 设置 NS=0, FIQ=0
bic r0, r0, #1 << 0        // 清除 NS 位
bic r0, r0, #1 << 2        // 清除 FIQ 位

// 写回修改后的 SCR
mcr p15, 0, r0, c1, c1, 0  // 将 SCR 写回

6. 总结

寄存器位 设置值 目的
NS (bit 0) 0 确保处理器处于 Secure 状态,防止非安全代码干扰安全逻辑。
FIQ (bit 2) 0 禁用 FIQ 中断进入 Monitor 模式,避免上下文切换和中断嵌套,提高稳定性。

5. 总结

通过将 SCR 寄存器中的 FIQ 位设置为 0,可以确保在 Secure World 处理 SMC 请求期间,任何触发的 FIQ 中断都不会导致处理器切换到 Monitor 模式。这样做的好处包括减少不必要的上下文切换、保持执行流程的原子性以及简化中断处理逻辑,从而提高系统的稳定性和性能。

1. SCR 寄存器简介

  • SCR(Secure Configuration Register):这是一个关键寄存器,用于控制从 Non-Secure 状态到 Secure 状态的转换规则。
  • 重要位说明
    • NS(bit 0):决定处理器是否处于 Non-Secure 状态。0 表示 Secure 状态,1 表示 Non-Secure 状态。
    • FIQ(bit 2):控制 FIQ(Fast Interrupt Request)中断的行为。如果设置为 1,则 FIQ 中断将导致进入 Monitor 模式;若设置为 0,则 FIQ 中断会在当前的安全状态下处理。

2. 设置 FIQ=0 的作用

(1) 当 FIQ = 1

  • 行为
    如果 SCR 寄存器中的 FIQ 位被设置为 1,那么任何触发的 FIQ 中断都会使处理器跳转到 Monitor 模式(即 Secure Monitor)。这是因为 Monitor 模式是 ARM TrustZone 架构中用于在 Secure 和 Non-Secure 状态之间切换的特权模式。
  • 影响
    • 上下文切换开销:每次 FIQ 中断发生时,处理器都需要保存当前状态并切换到 Secure Monitor,这增加了额外的上下文切换开销。
    • 潜在的竞争条件:频繁的上下文切换可能导致竞争条件,尤其是在处理敏感的 Secure 代码时,如 Trusted Applications (TAs)。

(2) 当 FIQ = 0

  • 行为
    如果将 SCR 寄存器中的 FIQ 位设置为 0,那么任何触发的 FIQ 中断将在当前的安全状态下处理。也就是说,在 Secure 状态下发生的 FIQ 中断会直接进入 FIQ 模式,而不是 Monitor 模式。
  • 好处
    • 减少上下文切换:通过避免不必要的 Monitor 模式切换,减少了上下文保存和恢复的开销,提高了性能。
    • 保持执行流程的原子性:确保在 Secure 状态下的操作不会被中断干扰,这对于需要高安全性的操作(如加密、认证等)非常重要。
    • 避免中断嵌套:防止由于 FIQ 中断导致的复杂中断嵌套问题,简化了中断处理逻辑。

3. 实际场景中的应用

假设我们正在处理一个来自 Normal World 的 SMC 请求,该请求需要由 OP-TEE 在 Secure World 中执行某些操作。在这个过程中:

  • 初始状态:处理器可能在处理 Normal World 的任务。
  • SMC 请求触发:Normal World 发出 SMC 请求,处理器切换到 Secure World。
  • 进入 smc_from_nsec:在此函数中,我们需要确保所有配置都符合 Secure World 的要求。因此,我们将 SCR 寄存器中的 FIQ 位设置为 0,以保证任何后续的 FIQ 中断不会导致不必要的 Monitor 模式切换。
  • 执行 Secure 操作:在 Secure World 中执行必要的操作(如调用 Trusted Application),不受 Non-Secure 中断的影响。
  • 返回 Normal World:完成 Secure 操作后,恢复先前的上下文,并返回到 Normal World 继续执行。

4. 示例代码

以下是一个简化的汇编代码片段,展示了如何在 smc_from_nsec 函数中修改 SCR 寄存器:

// 读取当前 SCR 值
mrc p15, 0, r0, c1, c1, 0

// 清除 FIQ 位(设置 FIQ=0)
bic r0, r0, #(1 << 2)

// 写回修改后的 SCR
mcr p15, 0, r0, c1, c1, 0

这段代码首先读取当前的 SCR 值,然后通过 bic 指令清除 FIQ 位(即将其设置为 0),最后将修改后的值写回到 SCR 寄存器。

在 ARM 架构中,特别是涉及到 TrustZone 安全扩展时,SCR(Secure Configuration Register) 寄存器用于配置安全状态和中断处理行为。其中,EA(External Abort)位(bit 3) 的设置对于确保系统的安全性与稳定性至关重要。以下是关于为什么通常会将 EA 位设置为 1(即启用外部中止进入 Monitor 模式)的详细解释:

1. SCR 寄存器中的 EA 位

  • 位置:位于 SCR 寄存器的第 3 位。
  • 作用
    • 当 EA 位设置为 1 时,任何外部中止(如访问未映射内存或执行数据中止)都会导致处理器进入 Monitor 模式
    • 如果 EA 位设置为 0,则外部中止将在当前的安全状态下处理。

2. 外部中止(External Abort)简介

  • 定义:外部中止指的是由于外部设备或内存系统的问题导致的异常情况,例如尝试访问一个不存在或不可访问的地址。
  • 影响
    • 可能破坏当前正在执行的任务,无论是 Secure World 还是 Non-Secure World。
    • 需要特别注意的是,当外部中止发生在 Secure World 中时,它可能泄露安全信息或导致安全漏洞。

3. 设置 EA=1 的原因

(1) 确保安全性的完整性和隔离性

  • 防止安全信息泄露:如果外部中止发生在 Secure World 而不进入 Monitor 模式,则可能导致异常处理程序在 Secure World 内运行。这增加了安全信息被泄露的风险,因为异常处理代码可能没有充分考虑安全性。
  • 保持隔离性:通过使外部中止强制进入 Monitor 模式,可以确保所有外部中止都由安全监控代码处理,从而维持了 Secure World 和 Non-Secure World 之间的严格隔离。

(2) 统一的异常处理策略

  • 简化异常处理逻辑:通过统一将外部中止导向 Monitor 模式,可以使异常处理更加一致和简单。Monitor 模式可以提供一种机制来决定如何处理这些异常,包括是否将其转发到相应的世界(Secure 或 Non-Secure),或者采取其他适当的措施。
  • 灵活性增强:Monitor 模式可以根据具体情况灵活地响应外部中止。例如,它可以检查异常的原因,并根据需要决定是终止当前操作、修复问题还是报告错误。

(3) 提高系统的健壮性

  • 避免潜在的系统崩溃:如果没有适当的处理,外部中止可能会导致系统不稳定或崩溃。通过让 Monitor 模式处理这些异常,可以增加额外的一层保护,确保即使发生外部中止,系统也能以受控的方式响应。
  • 支持错误恢复机制:Monitor 模式可以实现更复杂的错误恢复机制,比如重启受影响的部分而不影响整个系统的运行。

4. 示例场景

假设有一个嵌入式系统使用 OP-TEE 实现安全功能,该系统同时运行着 Normal World 和 Secure World 应用。如果 Normal World 中的应用程序尝试访问无效的内存地址,触发了一个外部中止:

  • EA=1(默认设置):此外部中止会导致处理器切换到 Monitor 模式,在这里可以评估异常的性质并决定如何处理。例如,可以选择忽略该异常(如果是预期的行为),或将控制权转移回 Non-Secure World 让其处理异常,或者采取其他适当的行动。

  • EA=0:在这种情况下,外部中止会在 Non-Secure World 中直接处理。虽然这可能适用于某些特定的情况,但它也可能带来安全隐患,尤其是当异常处理程序不够健壮时。

5. 示例代码

以下是一个简化的汇编代码片段,展示了如何在初始化或进入 Secure World 时配置 SCR 寄存器,包括设置 EA 位:

// 读取当前 SCR 值
mrc p15, 0, r0, c1, c1, 0

// 设置 EA=1 (启用外部中止进入 Monitor 模式)
orr r0, r0, #(1 << 3)

// 写回修改后的 SCR
mcr p15, 0, r0, c1, c1, 0

这段代码首先读取当前的 SCR 值,然后通过 orr 指令设置 EA 位(即将其设置为 1),最后将修改后的值写回到 SCR 寄存器。

6. 总结

将 SCR 寄存器中的 EA 位设置为 1 是为了确保所有外部中止都能进入 Monitor 模式,这有助于维护系统的安全性、简化异常处理逻辑以及提高整体的健壮性。通过这种方式,ARM TrustZone 架构能够更好地管理跨 Secure 和 Non-Secure Worlds 的异常处理流程,确保在遇到外部中止等异常情况时,系统仍能稳定且安全地运行。

posted @ 2025-05-12 10:55  颜小雀  阅读(99)  评论(0)    收藏  举报