在ARM TrustZone中,安全模式下的代码可以访问安全缓冲区,但无法访问非安全缓冲区,因为这可能会披露敏感数据。然而,在某些情况下,需要从安全监控运行时服务中访问非安全缓冲区。为了解决这个问题,可以使用以下方法:
volatile char *non_secure_buf;
non_secure_buf = (char *)0x1000; // 假设缓冲区地址是0x1000
#define SMC_FUNCTION_ID 0x12345678 // 定义SMC函数ID
unsigned long smc(unsigned long function_id, unsigned long arg1, unsigned long arg2, unsigned long arg3)
{
unsigned long ret;
asm volatile ("smc #0" // 发起SMC调用
: "=r" (ret) // 返回值存储在ret中
: "r" (function_id), "r" (arg1), "r" (arg2), "r" (arg3)
: "memory");
return ret;
}
void access_non_secure_buf(void)
{
char *buf = (char *)smc(SMC_FUNCTION_ID, (unsigned long)non_secure_buf, 0, 0); // 请求