【STM32U385RG 测评】+ TrustZone及其测试
#申请原创#STM32U385RG属于 STM32 超低功耗家族,其内核是基于 96MHz 高性能的 Arm® Cortex®-M33 ,它集成了 Arm TrustZone®及硬件加密加速器。
那啥是TrustZone呢?
从字面讲TrustZone是指信任区,具体到ARM TrustZone® 则是ARM为了防止设备有效资源被拷贝、破坏或篡改,防止被恶意攻击,对资产包括有形和无形资产进行,以防止恶意软件、硬件监视、硬件干预等方式破坏或获取设备信息。
在ARMv8-M架构下TrustZone的结构框架如图1所示,带安全扩展的ARM V8-M内核结构如图2所示。
图1 TrustZone结构框架
图2 内核结构
ARMv8-M所支持的运行与访问模式如图3所示,通过函数和中断可实现内核状态的切换,见图4所示。
图3 模式类型
图4 模式类型
对于函数调用方式:
• 新指令支持 安全世界 和 非安全世界 之间的函数调用
• SG、BXNS、BLXNS
• 新操作
• 软件,清除安全世界的通用寄存器内容
• 硬件,自动将下一条安全指令入栈到S stack,FNC_RETURN赋值给LR
对于中断方式:
• 只要优先级许可,彼此可以相互被打断
• 寄存器值自动入栈
• 被打断的代码,当前执行的上下文(通用寄存器)被硬件入栈到对应的堆栈
• 安全世界的堆栈 (MSP_S、PSP_S)
• 非安全世界的堆栈(MSP_NS、PSP_NS)
• 安全代码被非安全中断打断后
• 除了硬件自动入栈寄存器,还会自动清零当前寄存器的内容
对于STM32U5,它已从内核延伸到系统级的完整隔离,见图5所示。
图5 完整隔离
以例程GPIO_IOToggle_TrustZone工程为例,在其目录下的内容如图6所示。
图6 目录内容
此时,若打开名为Project的项目工程,会出现图7和图8的提示而无法打开,说明保护机制已启动。
图7 提示1
图8 提示2
若打开Secure目录下项目工程GPIO_IOToggle_TrustZone_S,则可以快速打开。
其主程序为:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GTZC_S_Init();
MX_ICACHE_Init();
GPIO_Init();
SecureInitIODone = 1;
HAL_GPIO_ConfigPinAttributes(LED_GPIO_Port, LED_Pin, GPIO_PIN_NSEC);
HAL_SuspendTick();
NonSecure_Init();
while (1)
{
}
}
由此可知,其作用是:当启用TrustZone安全功能(选项位TZEN=1)时,将IO的安全属性从安全更改为非安全。 要切换的IO是PA.05,对应LED2。 在安全代码中,IO被配置为输出,LED保持开启状态(持续两秒)。然后IO被传递给非安全代码,由非安全代码切换LED。
非安全模式的初始化函数为:
static void NonSecure_Init(void)
{
uint32_t vtor_ns;
funcptr_NS NonSecure_ResetHandler;
vtor_ns = SCB_NS->VTOR;
__TZ_set_MSP_NS((*(uint32_t *)vtor_ns));
NonSecure_ResetHandler = (funcptr_NS)(*((uint32_t *)((vtor_ns) + 4U)));
NonSecure_ResetHandler();
}
LED2的电路如图9所示,其控制引脚为PA5.
图9 LED2电路
对LED2的初始化函数为:
static void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
HAL_Delay(2000);
}
其配置引脚的定义为:
#define LED_Pin GPIO_PIN_5
#define LED_GPIO_Port GPIOA
由此可知,其作用是对引脚PA5进行功能配置,并输出高电平。
经程序的编译和下载,其结果如图10和图11所示。
图10 完成编译
图11 完成下载
经程序的测试运行,其效果为LED2被点亮,见图12所示。
图12 点亮LED2
此外,为了对非安全模式的测试,可对其初始化函数加以修改,修改后的内容为:
static void NonSecure_Init(void)
{
uint32_t vtor_ns;
funcptr_NS NonSecure_ResetHandler;
vtor_ns = SCB_NS->VTOR;
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
__TZ_set_MSP_NS((*(uint32_t *)vtor_ns));
NonSecure_ResetHandler = (funcptr_NS)(*((uint32_t *)((vtor_ns) + 4U)));
NonSecure_ResetHandler();
}
这样会在上电后,先点亮LED2,经2秒延时后便熄灭LED2。若将熄灭LED2的语句进行下移,也就是加入非安全模式,则对LED2的控制失效。
效果演示:
https://www.bilibili.com/video/BV1pqb3zZELx/?vd_source=f302fc0cc3a0425328db53a3b92082ca
页:
[1]