物联网安全-基于Cortex-M处理器的TrustZone技术简介(2)

物联网安全-基于Cortex-M处理器的TrustZone技术简介(2)

Secure/Non-secure转换

之前介绍了如何利用SAU和IDAU配置一块内存区域的安全属性,用户可以在安全区和非安全区定义相应的函数,TrustZone技术允许两种状态下的函数相互调用,在进行相互调用时需要用到几个特殊指令:SG、BXNS、BLXNS, 如下表所示。
在这里插入图片描述
执行状态切换时的具体操作如下图所示:
在这里插入图片描述
SG指令:用于从非安全状态切换到安全状态,是从非安全区跳转到NSC区域之后执行的第一条指令。
BXNS指令: 用于从安全状态返回到非安全状态。
BLXNS指令: 用于在安全状态下调用非安全函数。
这里介绍两种特殊的函数:Entry function和Non-secure function。

其中,Entry function是指那些可以被非安全函数调用的安全函数;Non-secure function是指那些可以被安全函数调用的非安全函数。

用户在实现两种状态下函数的相互调用时,不需要额外关注该执行哪条特殊指令(SG/BXNS/BLXNS),而只需要将那些被调用的函数定义为Entry function或 Non-secure function即可。下面简单介绍如何定义以及使用Entry function和Non-secure function。

1. Entry function

Entry function需要用“ attribute((cmse_nonsecure_entry)) ”属性修饰,举例如下:

    /* Entry function */
    int func1(int x) __attribute__((cmse_nonsecure_entry)) { 
        return x+3; 
}

此时func1()已经被定义为了entry function,在非安全内存中调用entry function的方法与调用普通的非安全函数的方法是相同的,如下所示:

   /* Call entry function func1 */
val1 = func1 (1);

这样即可实现非安全函数调用安全函数的功能。

2. Non-secure function call

Non-secure function函数定义如下所示:

typedef void __attribute_((cmse_nonsecure_call)) nsfunc(void);

在安全内存中的调用non-secure function的方法如下:

nsfunc *FunctionPointer;
FunctionPointer=cmse_nsfptr_create((nsfunc *)(0x21000248u));
If (cmse_is_nsfptr(FunctionPointer))
     FunctionPointer();

这样即可实现在安全函数中调用0x21000248u处的非安全函数。

工作流程

TrustZone的工作流程:
在这里插入图片描述

安全属性划分:

1. FLASH,RAM,ROM

2. 外设,GPIO

遵循下面规则:

SAU + IDAUTrusted Execution Environment RegisterEnd Result
Non-secureNon-secureNon-secure
Non-secureSecureSecure
SecureNon-secureERROR
SecureSecureSecure

3. 中断

根据 《Armv8-M Architecture Reference Manual》 可知中断默认安全,通过NVIC->ITNS修改安全属性。

水平有限,难免有错误之处。感谢NXP官方公众号对TrustZone技术的讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值