9.3 快速调用与标准调用
目录
- 1. 基本概念与差异
- 2. 技术实现细节
- 2.1 调用约定差异
- 2.2 上下文管理
- 3. 性能对比数据
- 4. 开发实践建议
- 4.1 选择调用类型的准则
- 4.2 混合调用注意事项
- 5. 典型问题排查
- 6. 平台适配要求
1. 基本概念与差异
在ARM Trusted Firmware中,安全监控调用(SMC)根据执行时间敏感性和上下文保存需求分为两种类型:
特性 | 快速调用(Fast Call) | 标准调用(Standard Call) |
---|---|---|
执行速度 | 高(通常<1μs) | 较低(可能>10μs) |
上下文保存 | 仅保留关键寄存器 | 完整上下文保存 |
使用场景 | 时间敏感操作 | 复杂安全服务 |
典型应用 | PSCI_CPU_ON, 中断转发 | 加密服务, 安全存储访问 |
可嵌套性 | 不支持 | 支持 |
SMC调用号范围 | 0x0-0x7FFF | 0x8000-0xFFFF |
2. 技术实现细节
2.1 调用约定差异
// 快速调用示例(BL31中处理)
uint64_t handle_fast_smc(uint32_t smc_fid, uint64_t x1, uint64_t x2,uint64_t x3) {// 最小化上下文保存return psci_cpu_on(x1, x2, x3);
}// 标准调用示例
uint64_t handle_std_smc(uint32_t smc_fid, cpu_context_t *ctx) {// 完整上下文保存与恢复save_full_context(ctx);return crypto_service(ctx->x1, ctx->x2);
}
2.2 上下文管理
-
快速调用:
- 仅保存X0-X3、PC、SP等关键寄存器
- 使用单独的栈空间(
runtime_svc_stack
) - 禁止阻塞操作
-
标准调用:
- 完整保存通用寄存器+系统寄存器
- 支持任务切换和阻塞调用
- 可使用动态内存分配
3. 性能对比数据
在Cortex-A72平台上的典型延迟:
操作 | 快速调用 | 标准调用 |
---|---|---|
调用进入时间 | 120ns | 850ns |
最小往返延迟 | 400ns | 1.2μs |
上下文保存开销 | 80ns | 620ns |
4. 开发实践建议
4.1 选择调用类型的准则
4.2 混合调用注意事项
- 快速调用中禁止触发标准调用
- 标准调用可嵌套其他标准调用(最大深度8层)
- 跨类型调用需通过
SMC_RET_SWITCH_CALL
特殊返回码
5. 典型问题排查
问题现象:快速调用中出现寄存器内容损坏
排查步骤:
- 检查是否意外修改了X4-X18寄存器
- 确认没有使用浮点/SIMD指令
- 验证栈指针是否对齐到16字节边界
问题现象:标准调用性能不达标
优化建议:
- 使用
SMCCC_OPTIMIZED_CALL
特性 - 减少不必要的上下文保存(通过
SMC_CTX_FLAG_NO_SAVE
) - 预分配服务所需的资源池
6. 平台适配要求
在plat_smc_helpers.c
中需要实现的必要函数:
/* 快速调用处理入口 */
const smc_handler_t fast_smc_handlers[] = {[PSCI_CPU_ON] = psci_fast_cpu_on,[IRQ_FORWARD] = irq_fast_forward
};/* 标准调用处理表 */
DECLARE_RT_SVC(crypto_svc, // 服务名OEN_TOS_START, // 所有者范围CRYPTO_SVC_ID, // 服务IDcrypto_handler // 处理函数
);
注意:在ARMv8.4+平台可启用
SMCCCv1.1
优化,通过SMCCC_ARCH_FEATURES
查询支持的加速特性。