在LPC55Sxx系列微控制器上使用 FreeRTOS并支持TrustZone 1 简介
LPC55Sxx 系列 MCU 是一款基于 Arm® Cortex®- M33 内核的微控制器,使用了支持TrustZone的ARMv8-M 架构。LPC55S69是高性能MCU之一,包括两个Cortex-M33内核,CPU0支持TrustZone-M的安全扩展。FreeRTOS 是一个轻量级的嵌入式操作系统;具有代码开源、可移植、可裁剪、调度策略灵活等特点;可方便地移植到各种嵌入式控制器中,已被广泛应用于各种嵌入式产品中。
本文以LPC55S69为例,介绍如何在支持 TrustZone 的 ARMv8-M 处理器中使用FreeRTOS。
2 TrustZone技术特点
TrustZone 技术具有以下特点:
• 允许用户将内存映射划分为安全和非安全区域。
• 阻止未经授权的对安全区的代码/数据的调试访问。
4 FreeRTOS 中TrustZone 的使用.....4
4.1 在 SDK v2.8 中使用 TrustZone 的
FreeRTOS...................................5
4.2 更安全的 FreeRTOS 使用方式 ..11
5 参考资料 ..................................... 12
• CPU 包括安全属性单元(SAU)和双份的(安全和非安全)的 NVIC、MPU、SYSTICK、核心控制寄存器等。安全/非安全代码可以访问自己分配的资源。
• 堆栈管理从原来的 Cortex-M 内核的主堆栈指针(MSP)和进程堆栈指针(PSP)两个寄存器扩展成4 个寄存器,来支持安全和非安全。
• 引入安全网关操作码的概念,非安全代码通过一套严格定义好的安全入口切如安全代码。
TrustZone 技术直接满足嵌入式系统的以下一些安全要求。
• 数据保护
敏感数据存储在安全存储空间中,只能由安全软件访问。只有经过安全检查或认证后,非安全软件才能访问调用为非安全域提供服务的安全API。
• 固件保护
预加载的固件存储在安全内存中,以防止它被逆向工程、破坏或恶意攻击。ARMv8-M 的 TrustZone 技术可以与额外的安全保护技术配合使用。例如,设备级读出保护是当今行业中常用的一种技术,可与 TrustZone 技术一起用于ARMv8-M 控制器来保护最终产品的固件。
• 操作保护
核心软件可以作为安全固件预加载,并且相应的外围设备可以配置为仅允许从安全状态下进行访问。通过这种方式,可以保护操作免受来自非安全端的入侵。
• 安全启动机制
安全启动机制可增强平台的安全性、保密性,因为它始终从安全内存启动。
3 安全环境配置
本节介绍如何配置安全环境,使用 TrustZone 技术保护系统重要资源。LPC55S69提供两级保护:CPU 级保护和系统级保护。
TrustZone 位于 CPU0 内部,属于 CPU 级保护。此外,LPC55S69使用安全的 AHB 控制器提供一层系统级保护,如图 1所示。
LPC55S69 安全环境的配置包括 TrustZone 的配置和 Secure AHB 控制器的配置两部分。TrustZone 的配置主要是 SAU 的配置。
3.1 TEE工具
安全环境的配置可以通过手动配置相应的寄存器来实现,也可以使用恩智浦的可信执行环境(TEE)工具来实现。建议开发者使用 TEE 工具快速实现 TrustZone 和安全 AHB 控制器的配置。图 2是 TEE 工具的 GUI 界面。
有关使用 TEE 工具的详细信息,请参阅 MCUXpresso 配置工具(桌面)用户指南(文档GSMCUXCTUG)。
3.2 安全/非安全状态切换
配置完 LPC55S69 的安全环境后,用户可以在实际项目中使用一些特殊的功能在安全和非安全状态之间进行切换。这里有两个特殊函数:非安全可调用函数(NSC function/Entry function)和非安全函数(Non-secure function)。
• 非安全可调用函数(NSC)
NSC 函数是可以被非安全函数调用的安全函数。NSC 函数需要使用attribute ((cmse_nonsecure_entry))属性来定义。
示例如下。
- attribute ((cmse_nonsecure_entry)) void vToggleGreenLED(void)
- {
- /* Toggle the on-board green LED. */
- GPIO_PortToggle(GPIO, LED_PORT, (1U << GREEN_LED_PIN));
- }
复制代码 非安全函数
非安全函数是可以被安全函数调用的函数。非安全函数需要使用attribute_((cmse_nonsecure_call))属性来定义。示例
如下。
- Typedef void _attribute_((cmse_nonsecure_call)) nsfunc(void);
- Nsfunc *FunctionPointer;
- FunctionPointer = cmse_nsfptr_create((nsfunc *) (0x21000248u));
- If (cmse_is_nsfptr(FunctionPointer))
- FunctionPointer();
复制代码 更多关于安全/非安全状态切换的信息,请参阅有关 ARMv8-M 架构的 TrustZone 技术的文档。
4 FreeRTOS 中 TrustZone 的使用
本节介绍如何在 LPC55S69 中运行 FreeRTOS 并启用TrustZone。FreeRTOS 官方提供了在LPC55S69 上支持Trustzone 运行的
FreeRTOS 示例。FreeRTOS 可以从 FreeRTOS 下载。LPC55S69 示例的路径为
FreeRTOS/Demo/CORTEX_MPU_M33F_NXP_LPC55S69_MCUXpresso,如图 3所示。
FreeRTOS 提供此演示的文档, 他们可以从RTOS下载。
NXP 的 LPC55S69 SDK 包也提供了一个支持 TrustZone 的 FreeRTOS 工程示例。项目名称为freertos_tzm,示例路径为
/SDK_2.8.2_LPCXpresso55S69_IAR/boards/lpcxpresso55s69/rtos_examples/freertos_tzm。freertos_tzm 项目如图 4所示。
4.1 SDK v2.8 中使用 TrustZone 的 FreeRTOS 示例
本节以 SDK v2.8 中的 freertos_tzm 项目为例,介绍 FreeRTOS 支持 TrustZone 的工作流程。freertos_tzm 示例的工作流程如图 5所示。
本项目的内存分区如图 6所示。
用户可以将一些重要的资源存储在一个安全的区域。FreeRTOS 内核存储在非安全区域,任务创建和调度过程也在非安全区域完成。这些非安全任务可以通过调用 NSC 函数来访问安全区域中的某些特定资源,安全函数可以调用非安全函数跳转到非安全区域。
4.1.1 创建用户任务
在 freertos_tzm 示例中,创建了两个用户任务,如图 7所示。
当用户使用xTaskCreate()函数在非安全区域创建任务时,会分配一个非安全任务栈。当任务切换时,非安全context可以存储
在非安全任务堆栈中。
4.1.1.1 分配安全堆栈
由于 TrustZone 技术将系统内存划分为安全区域和非安全区域,因此在执行非安全任务时可以调用NSC 函数。因此,还需要为
调用 NSC 函数的非安全任务分配一个安全堆栈来存储安全上下文(context)。安全栈的分配在第一次执行非安全任务时完成,
如图 8所示。
完整版查看请回复
|