查看: 4579|回复: 2

[原创] LPC55S16之TrustZone特色分析

[复制链接]
  • TA的每日心情
    开心
    2020-12-17 09:04
  • 签到天数: 346 天

    连续签到: 1 天

    [LV.8]以坛为家I

    19

    主题

    94

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    1363
    最后登录
    2025-5-7
    发表于 2020-8-23 18:52:30 | 显示全部楼层 |阅读模式
      Hello,又和大家见面了如上次所说,这次评测咱们围绕Cortex-M33的三大特色之一的TrustZone来做一次demo心得,虽然接触M33有一段时间了,由于工作原因排不开时间所以这是我一次玩TrustZone,有不足之处希望大家不吝赐教,在此感谢NXP官方和NXP社区的大力支持。
      首先翻开收据手册翻开TrustZone章节内容。
       保护.jpg
      可以看到保护区间是分地址区段的,像Same as above内容本身是属于保护阶段的,用户层是不能对其进行更改调配的,可以修改保护的就只能在Non-secure地址区间做对应的修改了,本次是基于NXP官方的演示demo_gpio来调试分析,打开keil的workspace,程序示例有ns和s两个。
    界面.jpg
    这两个程序分别起什么作用呢?ns程序里面就只有一个简单的循环体是基于s的程序配置来执行的,因为是执行的端口的IO脚读取,又因为使用的P0_5与debug口有冲突,小编又比较懒在此就没有去引出验证了。重点来讲s里面的程序,首先定义了__attribute__函数属性的non-secure回调函数类型,这个函数只能在硬件复位后才生效,因此在下载程序的时候不要勾选reset and run选项,否则会报错。然后进入TrustZone的初始化配置可以看到
    1. void BOARD_InitTrustZone()
    2. {
    3.     //####################################################################
    4.     //### SAU configuration ##############################################
    5.     //####################################################################

    6.     /* Set SAU Control register: Disable SAU and All Secure */
    7.     SAU->CTRL = 0;

    8.     /* Set SAU region number */
    9.     SAU->RNR = 0;
    10.     /* Region base address */
    11.     SAU->RBAR = REGION_0_BASE & SAU_RBAR_BADDR_Msk;
    12.     /* Region end address */
    13.     SAU->RLAR = ((REGION_0_END & SAU_RLAR_LADDR_Msk) | ((0U << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk)) |
    14.                 ((1U << SAU_RLAR_ENABLE_Pos) & SAU_RLAR_ENABLE_Msk);

    15.     /* Set SAU region number */
    16.     SAU->RNR = 0x00000001U;
    17.     /* Region base address */
    18.     SAU->RBAR = REGION_1_BASE & SAU_RBAR_BADDR_Msk;
    19.     /* Region end address */
    20.     SAU->RLAR = ((REGION_1_END & SAU_RLAR_LADDR_Msk) | ((0U << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk)) |
    21.                 ((1U << SAU_RLAR_ENABLE_Pos) & SAU_RLAR_ENABLE_Msk);

    22.     /* Force memory writes before continuing */
    23.     __DSB();
    24.     /* Flush and refill pipeline with updated permissions */
    25.     __ISB();
    26.     /* Set SAU Control register: Enable SAU and All Secure (applied only if disabled) */
    27.     SAU->CTRL = 0x00000001U;

    28.     //####################################################################
    29.     //### AHB Configurations #############################################
    30.     //####################################################################

    31.     //--------------------------------------------------------------------
    32.     //--- AHB Security Level Configurations ------------------------------
    33.     //--------------------------------------------------------------------
    34.     /* Configuration of AHB Secure Controller
    35.      * Possible values for every memory sector or peripheral rule:
    36.      *  0    Non-secure, user access allowed.
    37.      *  1    Non-secure, privileged access allowed.
    38.      *  2    Secure, user access allowed.
    39.      *  3    Secure, privileged access allowed. */

    40.     //--- Security level configuration of memories -----------------------
    41.     AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_FLASH_MEM_RULE[0] = 0x00000033U;
    42.     AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_ROM_MEM_RULE[0]   = 0;
    43.     AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_ROM_MEM_RULE[1]   = 0;
    44.     AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_ROM_MEM_RULE[2]   = 0;
    45.     AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_ROM_MEM_RULE[3]   = 0;
    46.     AHB_SECURE_CTRL->SEC_CTRL_RAMX[0].MEM_RULE[0]                     = 0;
    47.     AHB_SECURE_CTRL->SEC_CTRL_RAM0[0].MEM_RULE[0]                     = 0x33333333U;
    48.     AHB_SECURE_CTRL->SEC_CTRL_RAM1[0].MEM_RULE[0]                     = 0;
    49.     AHB_SECURE_CTRL->SEC_CTRL_RAM2[0].MEM_RULE[0]                     = 0;
    50.     AHB_SECURE_CTRL->SEC_CTRL_USB_HS[0].MEM_RULE[0]                   = 0;

    51.     //--- Security level configuration of peripherals --------------------
    52.     AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE0_MEM_CTRL0 = 0x00000033U;
    53.     AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE0_MEM_CTRL1 = 0;
    54.     AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE0_MEM_CTRL2 = 0;
    55.     AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE1_MEM_CTRL0 = 0;
    56.     AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE1_MEM_CTRL1 = 0;
    57.     AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE1_MEM_CTRL2 = 0;
    58.     AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE1_MEM_CTRL3 = 0;
    59.     AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT7_SLAVE0_RULE                        = 0x03000000U;
    60.     AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT7_SLAVE1_RULE                        = 0;
    61.     AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT8_SLAVE0_RULE                        = 0;
    62.     AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT8_SLAVE1_RULE                        = 0;
    63.     AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT9[0].SLAVE0_RULE                     = 0;
    64.     AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT9[0].SLAVE1_RULE                     = 0x00000003U;

    65.     //--- Security level configuration of masters ------------------------
    66.     AHB_SECURE_CTRL->MASTER_SEC_LEVEL        = 0;
    67.     AHB_SECURE_CTRL->MASTER_SEC_ANTI_POL_REG = 0x3FFFFFFFU;

    68. <font color="#ff0000">    //--------------------------------------------------------------------
    69.     //--- Pins: Reading GPIO state ---------------------------------------
    70.     //--------------------------------------------------------------------
    71.     // Possible values for every pin:
    72.     //  0b0    Deny
    73.     //  0b1    Allow
    74.     //--------------------------------------------------------------------
    75.     AHB_SECURE_CTRL->SEC_GPIO_MASK0 = 0xFFFFFFFFU;
    76.     AHB_SECURE_CTRL->SEC_GPIO_MASK1 = 0xFFFFFFFFU;</font>

    77.     //--------------------------------------------------------------------
    78.     //--- Interrupts: Interrupt security configuration -------------------
    79.     //--------------------------------------------------------------------
    80.     // Possible values for every interrupt:
    81.     //  0b0    Secure
    82.     //  0b1    Non-secure
    83.     //--------------------------------------------------------------------
    84.     NVIC->ITNS[0] = 0;
    85.     NVIC->ITNS[1] = 0;

    86.     //--------------------------------------------------------------------
    87.     //--- Global Options -------------------------------------------------
    88.     //--------------------------------------------------------------------
    89.     SCB->AIRCR = (SCB->AIRCR & 0x000009FF7U) | 0x005FA0000U;
    90.     SCB->SCR &= 0x0FFFFFFF7U;
    91.     SCB->SHCSR &= 0x0FFF7FFFFU;
    92.     SCB->NSACR                               = 0x00000C03U;
    93.     SCnSCB->CPPWR                            = 0;
    94.     AHB_SECURE_CTRL->SEC_MASK_LOCK           = 0x00000AAAU;
    95.     AHB_SECURE_CTRL->MASTER_SEC_LEVEL        = (AHB_SECURE_CTRL->MASTER_SEC_LEVEL & 0x03FFFFFFFU) | 0x080000000U;
    96.     AHB_SECURE_CTRL->MASTER_SEC_ANTI_POL_REG = (AHB_SECURE_CTRL->MASTER_SEC_ANTI_POL_REG & 0x03FFFFFFFU) | 0x080000000U;
    97.     AHB_SECURE_CTRL->CPU0_LOCK_REG           = 0x800002AAU;
    98.     AHB_SECURE_CTRL->MISC_CTRL_REG           = (AHB_SECURE_CTRL->MISC_CTRL_REG & 0x0FFFF0003U) | 0x00000AAA4U;
    99.     AHB_SECURE_CTRL->MISC_CTRL_DP_REG        = 0x0000AAA5U;
    100. }
    复制代码
      允许修改的正如刚刚数据手册上所讲的那样,本次这里只使用上述代码标红的字节区间。这个初始化是回调函数所调用执行的,因此它也是在硬件复位后才能执行。  最后就是功能区间了,这里省略基础IO初始化配置,只针对加密端重点剖析。
    1.     /* Set non-secure main stack (MSP_NS) */
    2.     __TZ_set_MSP_NS(*((uint32_t *)(NON_SECURE_START)));    <font color="#ff0000">//设置加密地址,官网定义的是0x00010000</font>

    3.     /* Set non-secure vector table */
    4.     SCB_NS->VTOR = NON_SECURE_START;                              <font color="#ff0000">  //使能non-secure矢量属性</font>
    5.    
    6.     /* Get non-secure reset handler */
    7.     ResetHandler_ns = (funcptr_ns)(*((uint32_t *)((NON_SECURE_START) + 4U)));  <font color="#ff0000">//获取复位句柄函数</font>
    8.      
    9.     /* Call non-secure application - jump to normal world */
    10.     /*  */
    11.     ResetHandler_ns();                                                                                              <font color="#ff0000"> //进入</font><span style="color: rgb(255, 0, 0);">non-secure回调函数</span>
    复制代码
      这里功能具体实现是通过两个按键在中断模式下使能RGB灯的绿灯和蓝灯的状态来区分。
    1. void SysTick_Handler(void)
    2. {
    3.     /* Control GPIO MASK based on S2 button press */  
    4.     if (GPIO_PinRead(DEMO_SW2_GPIO, DEMO_SW2_GPIO_PORT, DEMO_SW2_GPIO_PIN)) //复位按键
    5.     {
    6.         AHB_SECURE_CTRL->SEC_GPIO_MASK0 |= DEMO_BLUE_LED_PIN_SEC_MASK;
    7.     }
    8.     else
    9.     {
    10.         AHB_SECURE_CTRL->SEC_GPIO_MASK0 &= ~DEMO_BLUE_LED_PIN_SEC_MASK;
    11.     }
    12.     /* Control green LED based on S1 button press */
    13.     if (GPIO_PinRead(DEMO_SECURE_SW1_GPIO, DEMO_SECURE_SW1_GPIO_PORT, DEMO_SECURE_SW1_GPIO_PIN)) //唤醒按键
    14.     {
    15.         LED_GREEN_OFF();
    16.     }
    17.     else
    18.     {
    19.         LED_GREEN_ON();
    20.     }
    21. }
    复制代码
      上述函数可知只有执行完复位阶段后TrustZone才会生效执行绿灯闪烁一次,执行完后就封闭了,只有等待下一次reset完后才能执行一次,完后无法读取IO状态的。而蓝灯是基于普通IO来做的,状态是可以查询的,按下亮,放开就熄灭。  TrustZone的加密功能GPIO只是九牛一毛,更多的是对数据的封闭性,如果大家有兴趣小编可以后续继续更进。在此谢谢大家。
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4693

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10101
    最后登录
    2025-9-4
    发表于 2020-8-24 10:36:39 | 显示全部楼层
    通过楼主的帖子对Cortex-M33的安全区有一个直观的认识了。
    辛苦楼主了。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-2 08:40
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    103

    主题

    869

    帖子

    7

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4353
    最后登录
    2025-8-21
    发表于 2020-8-24 11:09:40 | 显示全部楼层
    睡神牛B
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-6 07:51 , Processed in 0.089269 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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