当前位置: 首页 > news >正文

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-0x7FFF0x8000-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平台上的典型延迟:

操作快速调用标准调用
调用进入时间120ns850ns
最小往返延迟400ns1.2μs
上下文保存开销80ns620ns

4. 开发实践建议

4.1 选择调用类型的准则

需要毫秒级响应?
标准调用
需要硬件资源?
优先快速调用

4.2 混合调用注意事项

  1. 快速调用中禁止触发标准调用
  2. 标准调用可嵌套其他标准调用(最大深度8层)
  3. 跨类型调用需通过SMC_RET_SWITCH_CALL特殊返回码

5. 典型问题排查

问题现象:快速调用中出现寄存器内容损坏
排查步骤

  1. 检查是否意外修改了X4-X18寄存器
  2. 确认没有使用浮点/SIMD指令
  3. 验证栈指针是否对齐到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查询支持的加速特性。

http://www.dtcms.com/a/276182.html

相关文章:

  • 串口连接工控机
  • Gameplay - 独立游戏Celeste的Player源码
  • 失败的面试经历二(ʘ̥∧ʘ̥)
  • 【赵渝强老师】国产数据库TiDB的代理路由:TiProxy
  • K3S滚动发布Jar
  • TCP详解——各标志位
  • 字母异位词分组
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十一课——图像均值滤波的FPGA实现
  • 家用智能摄像机PRV文件删除的恢复方法
  • 牛客网50题
  • word转pdf、pdf转word在线工具分享
  • C#调用Matlab生成的DLL
  • C#枚举:从基础到高级的全方位解析
  • NLP分词notes
  • 用一张“冰裂纹”石墨烯薄膜,让被动散热也能做 AI 推理——基于亚波长裂纹等离激元的零功耗温度-逻辑门
  • 深度学习图像分类数据集—铜片划痕识别分类
  • 创客匠人:解析创始人 IP 打造对知识变现的深层赋能
  • position: fixed和sticky的区别
  • 子数组最大平均数 I
  • Dataset类代码实战
  • 【LeetCode 热题 100】25. K 个一组翻转链表——迭代+哨兵
  • Spring AOP 是如何生效的(入口源码级解析)?
  • SpringBootloggers未授权访问漏洞处理
  • Flink创建执行环境的三种方式,也是Flink搭建程序的第一步
  • [特殊字符] 实时数据洪流突围战:Flink+Paimon实现毫秒级分析的架构革命(附压测报告)——日均百亿级数据处理成本降低60%的工业级方案
  • Java应用全链路故障排查实战指南:从系统资源到JVM深度诊断
  • WebSocket:构建实时交互的 Web 应用
  • C# VB.NET多进程-管道通信,命名管道(Named Pipes)
  • C语言结构体
  • C++---<cctype>