概述
考虑到非安全世界有时需要访问安全世界的资源,安全世界可通过提供安全服务供非安全世界调用实现此需求。
在 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 |
安全代码,包含 |
bsec_svc.c |
安全代码,提供非安全态可调用的安全服务 |
main.c |
非安全代码,演示如何通过 SMC 调用安全服务 |
rtk_svc_setup.h |
定义 |
此示例演示了如何从非安全代码调用安全服务。用户可参考该示例,根据需求添加自定义代码。示例中使用的函数 ID 为 0x8200_0001
,属于 SiP 服务调用范围(0x8200_0000
~ 0x8200_FFFF
)。
编译此示例的步骤如下:
将
main.c
复制到\amebasmart_gcc_project\project_ap\src
文件夹下,覆盖原有文件生成并下载固件
重启设备
设备启动成功后,日志中会输出 secure test here
。
备注
当 CPU 通过 SMC 进入监控模式时,所有中断请求将被屏蔽,直至返回非安全态后才会继续处理。