查看: 8290|回复: 12

[分享] LPC55Sxx之TrustZone 技术简介(附培训视频)

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3900

    主题

    7513

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39639
    最后登录
    2025-8-1
    发表于 2019-1-17 13:32:45 | 显示全部楼层 |阅读模式
    LPC5500系列MCU以Arm最新的Cortex-M33为核心,与前几代产品相比,改进了产品架构并提高了集成度;大幅减小了功耗,并提供高级安全功能,通过Arm TrustZone-M保护资产。
    近几年来,物联网(IoT)成为了嵌入式开发者的热门话题。IoT系统产品变得更加复杂,同时也需要更好的方案来保证系统的安全。
    传统的方案是通过把软件分成特权和非特权两部分解决。特权级软件利用MPU防止非特权软件的应用,访问包含敏感信息在内的关键系统资源。
    这些方案对一些IoT系统非常适合,但是在一些情况下,只有两层划分是不够的。特别是那些包含很多复杂特权级别的软件组成的系统,特权级代码的一个缺陷,就可能导致黑客彻底的控制整个系统。
    为了更好地提高MCU的安全性能,Arm在ARMv8-M架构中引入了TrustZone技术。ARMv8-M中的TrustZone技术是一种可选择的安全扩展,旨在为各种嵌入式系统应用提供基本的安全保障。
    TrustZone技术将系统分为安全区和非安全区两部分,并通过特殊的指令实现两种区域内函数的相互访问。
    11.png

    TrustZone的概念不是最新的了,它被应用在Arm Cortex-A系列处理器中已经有一段时间了,现在被扩展到了ARMv8-M 处理器中,它与Cortex-A处理器中的TrustZone并不是完全相同的,本篇中所描述的TrustZone技术都是基于Cortex-M处理器的。

    1.1 TrustZone的特性:
    1、允许用户将内存划分为安全和非安全区域;
    2、允许在未经过身份验证时阻止调试安全代码/数据;
    3、NVIC、MPU、SYSTICK、内核控制寄存器等也被备份到两个区域中 ,安全代码和非安全代码可以独立访问自己的资源;
    4、安全区和非安全区都有MSP和PSP堆栈指针;
    5、提出了Secure Gateway的概念,非安全代码可以通过Secure Gateway访问特定的安全代码,这也是非安全代码访问安全代码的唯一方式;
    6、提供了一个Stack Limit Checking(堆栈限制检查)功能,可以用于检测堆栈溢出的情况。在Cortex-M33对应的ARMv8-M架构中,每个堆栈指针都有相应的堆栈限制寄存器。


    1.2 Register banking
    上节提到一些有内核相关的寄存器也被备份到了安全/非安全区域中,下图展示了具体哪些通用/特殊寄存器被备份到两种内存中。

    12.png

    1.3 TrustZone 技术可以满足的安全需求
    Data protection:敏感数据可以存储在安全内存中,只可以被安全软件访问。只有在安全检查和授权之后,非安全软件才可以访问安全APIs。
    Firmware protection:固件可以预装载在安全区域中,防止逆向操作和恶意攻击。
    Operation protection:关键操作可以像安全固件一样,被预加载到安全内存中,并且配置适当的外设仅在安全状态下访问。通过这种方式, 可以保护操作免受来自非安全端的入侵。
    Secure boot:安全启动机制可以使用户对自己的平台充满信心,因为它始终从安全内存启动。



    二、Secure/Non-Secure存储器配置
    在Cortex-M33中,如果选配了TrustZone技术,则4G的内存空间将被划分为安全和非安全内存区域。安全内存空间又可以进一步划分为两种类型: Secure和Non-secure Callable(NSC)。
    13.png

    三种内存区域的特性:
    Secure:安全数据只可以被安全代码访问,安全代码只有在CPU处于安全模式时才可以被执行。
    Non-secure:非安全数据可以被安全和非安全状态访问,但非安全代码只能在CPU处于非安全状态时被执行。
    Non-secure Callable(NSC):NSC区域作为非安全函数访问安全函数的跳板。非安全代码需要先跳转到NSC区域中,执行SG指令,然后再跳转到相应的的安全函数处执行,这也是NS代码访问S函数的唯一方式。

    14.png
    引入NSC存储区的原因,是为了防止其他二进制数据(例如,具有与SG指令的操作码相同的值的查找表)被用作安全状态的入口函数。 2.1 内存区域的的安全属性定义

    2.1 内存区域的的安全属性定义
    内存区域的安全属性是由Secure Attribution Unit(SAU)和Implementation Defined Attribution Unit(IDAU) 共同决定的。
    SAU的作用和IDAU是相似的,都是用于分离安全区和非安全区。两者最大的区别是SAU位于CPU内部,IDAU在CPU外部。
    无论是IDAU和SAU都可以定义一块内存的安全属性,此时CPU会选择两者中较高的安全属性作为此块内存最终的安全属性,最高的安全属性是Secure,其次是Non-Secure Callable,最后是Non-secure。

    15.png

    2.2 IDAU
    IDAU除了可以向处理器指示特定存储器地址是Secure、NSC还是Non-secure,提供存储器地址所在的区域编号之外,它还可以标记免受安全检查的内存区域,例如ROM表。
    理论上,IDAU是可以设计为可编程的,但是IDAU接口上的信号位于时序的关键路径上,这会使IDAU的设计变得非常复杂,不切实际,也会导致设计中的门数更高。
    实际上,IDAU只提供了有限的可配置的简单存储器映射。
    16.png

    LPC55Sxx 的IDAU提供的配置如下图所示:
    17.png
    其中,0x00000000到0x1FFFFFFF是NS区域,在0x20000000到0xFFFFFFF范围内,是根据存储器地址的第28位来判断该内存地址的安全属性,若Bit_28=0, 则为非安全地址,若Bit_28=1, 则为安全地址。

    2.3 SAU
    SAU为每个内存区域定义了一个Region Number(RN)。RN可以被TT指令用来决定目标内存的访问权限和安全属性。RN的数量可以被SAU配置为0、4或者8。
    SAU是由设计者配置的,设计者可以在IDAU配置的内存属性的基础上,用SAU去重定义内存中的一些区域的安全属性,CPU会根据IDAU和SAU的配置,决定内存的最终安全属性。
    LPC55Sxx复位后,默认的SAU配置是: 所有存储空间都是安全的。结合IDAU的默认配置,LPC55Sxx的最终默认配置如下图所示,即所有内存区域都是安全的。

    18.png



    三、Secure/Non-secure转换
    第二节中介绍了如何利用SAU和IDAU配置一块内存区域的安全属性,用户可以在安全区和非安全区定义相应的函数,TrustZone技术允许两种状态下的函数相互调用,在进行相互调用时需要用到几个特殊指令:SG、BXNS、BLXNS, 如下表所示。
    19.png

    执行状态切换时的具体操作如下图所示:
    20.png

    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。



    3.1   Entry function
    Entry function需要用“__attribute__((cmse_nonsecure_entry)) ”属性修饰,举例如下:
    1. /* Entry function */
    2.     int func1(int x) __attribute__((cmse_nonsecure_entry)) {
    3.         return x+3;
    4. }
    复制代码
    此时func1()已经被定义为了entry function,在非安全内存中调用entry function的方法与调用普通的非安全函数的方法是相同的,如下所示:
    1. /* Call entry function func1 */
    2. val1 = func1 (1);
    复制代码
    这样即可实现非安全函数调用安全函数的功能。

    3.2 Non-secure function call
    Non-secure function函数定义如下所示:
    1. typedef void __attribute_((cmse_nonsecure_call)) nsfunc(void);
    复制代码
    在安全内存中的调用non-secure function的方法如下:
    1. nsfunc *FunctionPointer;
    2. FunctionPointer=cmse_nsfptr_create((nsfunc *)(0x21000248u));
    3. If (cmse_is_nsfptr(FunctionPointer))
    4.      FunctionPointer();
    复制代码
    这样即可实现在安全函数中调用0x21000248u处的非安全函数。



    四、总结
    看到这里,各位看官是不是对LPC55Sxx中的TrustZone技术的使用方法有了初步的了解呢,下面小编再为大家总结一下使用TrustZone时软件的工作流程:
    21.png
    在明白了这些之后,大家就可以开始行动起来,利用手里的LPC55Sxx来设计自己的安全系统了。

    最后,让我们来看看由本文作者做的,一个关于TrustZone的详细培训视频,更深入地理解前面所讲内容。马上观看>>




    延伸阅读
    MCU界的小钢炮——LPC5500
    LPC5500的DSP加速器——Power十足的PowerQuad
    低成本和安全边缘节点兼备! LPC5500这个价格你满意吗(含资料)
    关于LPC5500技术资料
    qiandao qiandao
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-7-4 08:15
  • 签到天数: 336 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3

    主题

    1562

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    5780
    最后登录
    2025-7-31
    发表于 2019-1-17 16:54:22 | 显示全部楼层
    管管,标题少了个 L 字吧
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 17:03
  • 签到天数: 1855 天

    连续签到: 6 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112653
    最后登录
    2025-8-2
    发表于 2019-1-19 21:46:57 | 显示全部楼层
    管管,文章看懂了,现在就差一个LPC55的开发板了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-1-25 13:45
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    0

    主题

    3

    帖子

    0

    新手上路

    Rank: 1

    积分
    15
    最后登录
    2020-6-22
    发表于 2019-1-25 14:15:38 | 显示全部楼层
    什么时候给介绍一下MPC5748G+hsm+4G模块设计和使用
    要过年了,一年感觉啥都没有收获
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 2582 天

    连续签到: 173 天

    [LV.Master]伴坛终老

    1

    主题

    2995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    8630
    最后登录
    2025-8-3
    发表于 2019-2-28 08:15:18 | 显示全部楼层
    支持。。。。。。。。
    开心
    回复

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 2582 天

    连续签到: 173 天

    [LV.Master]伴坛终老

    1

    主题

    2995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    8630
    最后登录
    2025-8-3
    发表于 2019-3-1 08:40:15 | 显示全部楼层

    早安!签到了!
    开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 2582 天

    连续签到: 173 天

    [LV.Master]伴坛终老

    1

    主题

    2995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    8630
    最后登录
    2025-8-3
    发表于 2019-3-2 08:10:35 | 显示全部楼层

    谢谢分享
    开心
    回复

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 2582 天

    连续签到: 173 天

    [LV.Master]伴坛终老

    1

    主题

    2995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    8630
    最后登录
    2025-8-3
    发表于 2019-3-3 08:03:08 | 显示全部楼层
    早安!签到了!
    开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 2582 天

    连续签到: 173 天

    [LV.Master]伴坛终老

    1

    主题

    2995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    8630
    最后登录
    2025-8-3
    发表于 2019-3-4 08:17:51 | 显示全部楼层
    早安!签到了!
    开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 2582 天

    连续签到: 173 天

    [LV.Master]伴坛终老

    1

    主题

    2995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    8630
    最后登录
    2025-8-3
    发表于 2019-3-5 08:32:22 | 显示全部楼层
    早安!签到了!
    开心
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-3 16:58 , Processed in 0.103920 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表