1. ARM SMC与HVC调用机制概述
在ARM架构的安全和虚拟化实现中,SMC(Secure Monitor Call)和HVC(Hypervisor Call)是两种至关重要的特权调用机制。作为系统级开发人员,理解这些调用的规范对构建可靠的安全监控程序和虚拟机监控程序至关重要。
SMC调用用于从非安全状态(Non-secure state)进入安全状态(Secure state),通常由EL3级别的安全监控代码处理。而HVC调用则用于从客户操作系统(Guest OS)向虚拟机监控程序(Hypervisor)发起请求,由EL2级别的hypervisor代码处理。这两种调用机制构成了ARM平台上安全和虚拟化功能的基础通信渠道。
关键提示:在实际开发中,SMC和HVC调用最常见的应用场景包括安全服务请求(如加密操作)、电源管理(通过PSCI)、虚拟设备模拟以及系统监控功能等。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 寄存器使用规范详解
2.1 通用寄存器使用规则
ARM架构为SMC和HVC调用定义了严格的寄存器使用规范,这些规范在AArch32和AArch64状态下有所不同:
AArch64调用约定(SMC64/HVC64)
- X0:函数标识符(Function Identifier)
- X1-X3:参数寄存器,同时用于返回结果
- X4-X5:参数寄存器
- X6:可选会话ID(Session ID)
- X7:可选客户端ID(Client ID)或安全OS ID
- X8-X17:参数寄存器(部分可能被调用修改)
- X18-X28:必须由被调用者保存的寄存器
- X29/X30:帧指针和链接寄存器
AArch32调用约定(SMC32/HVC32)
- R0:函数标识符
- R1-R3:参数寄存器,同时用于返回结果
- R4-R5:参数寄存器
- R6:可选会话ID
- R7:可选客户端ID或安全OS ID
- R12:临时寄存器(可能被调用修改)
2.2 浮点与向量寄存器处理
SME(Scalable Matrix Extension)、SVE(Scalable Vector Extension)、SIMD和浮点寄存器的处理需要特别注意:
-
禁止使用规则:这些寄存器不能用于参数传递或结果返回。任何符合规范的SMC/HVC调用都必须遵守此规则。
-
状态保存要求:
- 调用实现必须确保保存调用上下文的以下寄存器状态:
- SME:ZA矩阵寄存器
- SVE:Z0-Z31、P0-P15、FFR寄存器
- Advanced SIMD和浮点:V0-V31、FPCR、FPSR
- 调用实现必须确保保存调用上下文的以下寄存器状态:
-
优化处理:
- 如果调用上下文没有活跃的SVE寄存器状态(P0-P15、FFR以及Z0-Z31中索引大于12
