概述

考虑到非安全世界有时需要访问安全世界的资源,安全世界可通过提供安全服务供非安全世界调用实现此需求。

在 ARM 架构中,普通非安全态与安全态之间的同步控制通过安全监控调用(Secure Monitor Call, SMC)异常实现。SMC 异常由 SMC 指令触发,并由安全监控器(Secure Monitor)​处理,其行为由寄存器传递的参数决定。

在 FreeRTOS & ATF-SP_MIN 环境下,系统通过 SMC 指令进入监控模式,并通过 R0 寄存器传入一个 32 位整型函数 ID,用于标识安全世界中调用的服务功能。不同函数 ID 对应不同的安全服务。

更多关于 SMC 调用规范的信息,请参考 ARM 官方文档。

代码样例

AP 安全服务代码样例位于 {SDK}\component\example\peripheral\raw\CA32TrustZone\src\main.c

相关文件路径及描述如下:

  • rtk_smc_handler:位于 {SDK}\component\soc\amebasmart\atf\plat\realtek\sheipa\service\rtk_svc_setup.c

  • 安全服务代码:位于 {SDK}\component\soc\amebasmart\atf\plat\realtek\sheipa\service\bsec_svc.c

  • 头文件:位于 {SDK}\component\soc\amebasmart\atf\plat\realtek\sheipa\include

文件名

描述

rtk_svc_setup.c

安全代码,包含 rtk_smc_handler

bsec_svc.c

安全代码,提供非安全态可调用的安全服务

main.c

非安全代码,演示如何通过 SMC 调用安全服务

rtk_svc_setup.h

定义 smc_fid (SMC 函数 ID)

此示例演示了如何从非安全代码调用安全服务。用户可参考该示例,根据需求添加自定义代码。示例中使用的函数 ID 为 0x8200_0001,属于 SiP 服务调用范围​(0x8200_0000 ~ 0x8200_FFFF)。

编译此示例的步骤如下:

  1. main.c 复制到 \amebasmart_gcc_project\project_ap\src 文件夹下,覆盖原有文件

  2. 生成并下载固件

  3. 重启设备

设备启动成功后,日志中会输出 secure test here

备注

当 CPU 通过 SMC 进入监控模式时,所有中断请求将被屏蔽,直至返回非安全态后才会继续处理。