查看: 3706|回复: 0

LPC55S69安全环境的快速搭建

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

    连续签到: 2 天

    [LV.8]以坛为家I

    3900

    主题

    7513

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39639
    最后登录
    2025-8-1
    发表于 2019-12-19 13:02:37 | 显示全部楼层 |阅读模式
    LPC55S69是一款Cortex-M33内核的MCU,采用ARMv8-M架构,包含了两颗Cortex-M33内核,其中CPU0支持TrustZone的安全扩展功能,接下来笔者将会给大家讲解如何在LPC55S69平台上快速实现安全环境的搭建,即实现安全资源和非安全资源的隔离。


    TEE Tool


    安全环境的配置可以借助TEE(Trusted Execution Environment)tool来实现,TEE tool是MCUXpresso Config Tool v6版本中新增的一个功能,可以实现TrustZone和Secure AHB Controller的快速配置,除此之外使用MCUXpresso Config Tool还可以很方便的配置引脚、时钟、外设等功能,并生成相应的C语言代码,更新到工程中。
    新的MCUXpersso Config Tool已经集成到了MCUXpresso IDE v11.0之后的版本中,用户只需要下载最新版的MCUXpresso IDE即可,点击此处下载或访问NXP官网:
    http://mcuxpresso.nxp.com/en/welcome


    使用TEE Tool配置LPC55S69的安全环境


    本节以LPC55S69为例介绍如何使用TEE Tool进行安全环境的配置。


    打开MCUXpresso IDE v11.0然后导入LPC55S69 SDK中的TrustZone目录下的hello_world工程,包括hello_world_s和hello_world_ns两个工程,然后点击工具栏的Config Tools按钮,选择TEE,左击“TEE”按钮打开TEE Tool。
    1.png
    打开TEE tool之后,选择hello_world_s工程,即可看到SDK工程中的默认配置,如下图所示:
    2.png
    接下来就可以进行TrustZone和Secure AHB Controller的配置了,其中TrustZone的配置主要是指SAU的配置。


    SAU的配置


    关于Security Attribution Unit (SAU) 的作用,可以参考笔者的另一篇文章《LPC55Sxx之TrustZone技术简介》。



    SAU和IDAU(Implementation Defined Attribution Unit)共同决定了一块内存的安全属性,由于IDAU已经在芯片出厂的时候由厂商固化,因此用户在进行开发的时候只需要使用SAU去重新配置相应内存的安全属性即可,一块内存的最终的安全属性由SAU和IDAU两者中较高的安全属性决定,如下图所示:
    3.png
    在TEE tool中打开hello_world_s工程之后,可以看到在Security access configuration栏下列出了包含SAU在内的多个选项,点击SAU选项即可进行SAU的配置。在不使能SAU时,SAU默认0x00000000—0xFFFFFFFF范围内都是安全的;使能了SAU之后,最多可以配置8个SAU region,对于那些没有覆盖到的区域仍使用SAU的默认配置,即都属于安全区。
    4.png
    上图中显示了SDK的hello_world_s工程中提供的SAU的配置,定义了两个NS region(region 0和region 1)和一个NSC region(region 2),其中region 0 用来存放非安全的代码,region 1用来存放非安全的数据,region 2用来存放Non-secure callable(NSC)类型的函数,NSC函数是指那些可以被非安全函数调用的安全函数。用户可以根据实际功能需要,在此基础上修改region大小和数量。



    结合IDAU的默认配置,此时LPC55S69内存的最终的安全属性如下图所示:
    5.png
    Secure AHB Controller的配置



    LPC55S69提供了两级保护,TrustZone位于CPU0内部,属于CPU级的保护; 除此之外,LPC55S69还利用Secure AHB Controller提供了一层系统级保护,Secure AHB总线的框图如下图所示:
    6.png
    对于任何一个将要访问的地址,CPU0都会输出两个单端信号HPRIV和HNONSEC来指示这个给定的地址的安全属性。HPRIV信号是由MPU控制的,决定了是特权访问还是非特权访问;HNOSEC信号是由SAU/IDAU控制的,决定了是需要在安全状态下访问还是非安全状态下访问,两种信号共同决定了四种安全等级(S-Priv/S-User/NS-Priv/NS-User)。


    Secure AHB Bus会接收这些单端信号并和Secure AHB Controller定义的安全等级比较,如果HPRIV/HNONSEC指示的安全属性和Secure AHB controller定义的安全等级不冲突,则访问是合法的。若是不合法的访问,此时会产生Security violation interrupt。


    Secure AHB Controller由三部分组成的:


      1.Memory Protection Checkers(MPC)
      2.Peripheral Protection Checkers(PPC)
      3.Master Security Wrapper(MSW)
    其中MPC实现了各个内存块的安全等级的配置,PPC实现了各个外设(slave)的安全等级的配置,MSW实现了除CPU0之外的各个master的安全等级的配置。


    当HPRIV/HNONSEC指示的安全等级大于或等于Secure AHB Controller定义的安全等级时,就可以访问相应资源。

    使用MPC配置内存的安全等级


    只有当MPC配置的内存的安全等级小于或者等于HPRIV/HNONSEC指示的安全等级时,CPU0才可以合法的访问这些内存,因此在配置完SAU之后,也需要使用MPC将内存配置为相对应的安全等级。



    hello_world_s工程的linker file中规定了0x10000000-0x1000FFFF 64K空间用来存放安全的代码,且规定了0x30000000-0x30007FFF 32K 空间用来存放安全的数据,linker file如下图所示:
    7.png
    所以需要使用MPC将这两块内存的安全等级设置为安全特权级(S-Priv),只有当CPU0处于安全/特权状态下才可以访问此区域。点击Security access configuration栏目下的MPC选项即可进行内存的安全等级的配置,如下图所示:
    8.png
    由于已使用SAU将包含这两块区域的内存配置为安全区,且在默认状态下,MCU上电之后处于特权级状态,所以当CPU0在安全状态下访问这两块区域内的地址时输出到Secure AHB 总线上的HPRIV/HNONSEC信号为S-Priv,与MPC配置的安全等级相同,所以可以合法访问这两块内存。事实上,当使用MPC将这两块内存的安全等级配置为小于或等于S-Priv时,处于安全-特权状态下的CPU0都是可以合法访问这两块内存的,因为此时HPRIV/HNONSEC指示的安全等级高于MPC配置的内存的安全等级。


    Master/Slave的安全等级配置



    除了需要使用MPC来配置内存的安全等级外,还需要使用MSW和PPC配置master和slave为相对应的安全等级。点击Security access configuration 目录下的Master/Slave按钮即可进行Master和Slave的安全等级的配置,如下图所示:
    9.png
    LPC55S69中除CPU0之外的master可以分为两类:


    Simple master—只能进行数据传输的master,如DMA,SDIO等
    Smart master—可以进行数据传输和数据处理的master,如CPU1
    在LPC55S69中只有CPU1属于 smart master,其余master都是simple master。


    上图中的Simple Master in Strict Mode是指simple master的安全等级必须和slave的安全等级必须完全一致才可以访问slave,如果是非严格模式,则只要master的安全等级大于或等于slave的安全等级就可以访问slave。Smart Master in Strict Mode也是相同的道理,但CPU0不受此严格模式的限制,只要CPU0的安全等级高于或等于slave的安全等级时,就可以访问slave。


    在本例程中,SDK代码默认将FLEXCOMM0,IOCON,Syscon三个slave的安全等级配置为S-Priv,只有当CPU0和其他master处于S-Priv状态下才可以访问此外设。对于安全等级为NS-User的外设,在非严格模式下,若simple master 和 smart master的安全等级等于或高于NS-User时就可以访问这些外设;而在严格模式下,只有当simple master或smart master的安全等级为NS-User时,才可以访问这些外设。由于CPU0不受严格模式的限制,所以只要CPU0的安全等级大于或等于NS-User时就可以访问这些外设。用户可以根据需要配置master和slave的安全等级。


    中断的配置



    LPC55S69芯片上电之后,默认状态下所有中断都是安全的。无论CPU处于安全还是非安全状态下,若此时发生了中断,CPU都会跳转到安全区执行相应的中断服务函数。用户可以根据需要将中断配置为安全中断或非安全中断。点击Security access configuration栏目下的Interrupts按钮即可进行中断的安全属性的配置,如下图所示:
    10.png
    更新代码


    完成相关的安全配置之后,点击“Update Code”按钮将生成的代码更新到工程中。



    点击“change”按钮可以看到哪些地方的代码发生了改变。
    11.png
    比如将GINT0中断配置为非安全中断之后,更新代码时就可以看到下图
    12.png
    点击“OK” 按钮,确定更新 tzm_config.c 中的代码。此时就完成了LPC55S69安全环境的配置,实现了安全资源和非安全资源的隔离。如果用户使用MCUXpresso IDE进行软件开发,只需要在此工程的基础上进行应用层软件开发即可;若用户不熟悉MCUXpresso IDE,选择Keil或者IAR进行开发,则可以用TEE tool生成的最新tzm_config.c文件替换原工程中的文件,然后再进行应用层软件开发。


    总结



    Secure AHB Controller大约有80个寄存器,若采用手动的方法去配置各个用到的内存块、master/slave以及中断,需要花费很多精力去查阅手册中的寄存器配置,使用TEE工具可以快速的配置TrustZone和Secure AHB Controller,且可以生成相应的C代码,这样不仅减小了用户的开发难度也极大的提高开发效率。






    作者:张杨@NXP                      文章出处:恩智浦MCU加油站

    qiandao qiandao
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-3 15:03 , Processed in 0.079895 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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