在带有TrustZone的LPC55Sxx系列微控制器上使用FreeRTOS
完整版请查看>>>
1引言
LPC55Sxx系列MCU是基于Arm®Cortex®-M33内核的微控制器,使用启用了TrustZone的ARMv8-M架构.LPC55S69是包括2个Cortex-M33内核在内的高性能MCU之一,CPU0支持安全扩展TrustZone-M。 FreeRTOS是一个轻量级的嵌入式操作系统。它具有开放源代码,可移植性,可定制性和灵活的调度策略的特征。它可以轻松移植到各种嵌入式控制器中,并已广泛用于各种嵌入式产品中。本文档以LPC55S69作为描述如何在支持TrustZone的ARMv8-M处理器中使用FreeRTOS的示例。
2 TrustZone技术的功能
TrustZone技术具有以下功能:
•允许用户将内存映射划分为“安全”和“非安全”区域。
•未经身份验证时阻止对安全代码/数据的调试。
•CPU包括安全归因单元(SAU)以及NVIC,MPU,SYSTICK,核心控制寄存器等的副本。安全/非安全代码可以访问自己分配的资源。
•堆栈管理从原始Cortex-M中的两个堆栈指针,主堆栈指针(MSP)和进程堆栈扩展指向四个的指针(PSP),分别将上述对提供给安全和不安全。
•引入了安全网关操作码的概念,以允许安全代码从一组定义严格的入口点集。
非安全代码。
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工具
可以通过手动配置相应的寄存器或使用NXP的受信任执行环境(TEE)工具来实现安全环境的配置。建议开发人员使用TEE工具快速实施TrustZone的配置并保护AHB控制器。图2显示了TEE工具的GUI界面。
有关使用TEE工具的详细信息,请参见《 MCUXpresso配置工具用户指南》(台式机)(文档GSMCUXCTUG)。
3.2安全/非安全状态开关
配置LPC55S69的安全环境后,用户可以在实际项目中使用一些特殊功能进行切换在安全状态和非安全状态之间。这是两个特殊功能:非安全可调用(NSC功能/进入功能)和非安全功能。
•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通过TrustZone使用FreeRTOS
本节描述了如何在启用TrustZone的LPC55S69中运行FreeRTOS。 FreeRTOS正式提供FreeRTOS支持TrustZone在LPC55S69上运行的示例。可以从Free RTOS下载FreeRTOS。 LPC55S69的路径示例是FreeRTOS / Demo / CORTEX_MPU_M33F_NXP_LPC55S69_MCUXpresso,如图3所示。
FreeRTOS提供了有关此演示的文档。可以从RTOS下载文档。
恩智浦的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项目为例,介绍支持TrustZone的FreeRTOS的工作流程。
freertos_tzm示例的工作流程如图5所示。
该项目的内存分区如图6所示。
用户可以将一些重要资源存储在安全区域中。FreeRTOS内核存储在非安全区域中,任务创建和调度过程也在非安全区域中完成。这些非安全任务可以通过调用NSC函数来访问安全区域中的某些特定资源,并且安全功能可以调用非安全功能以跳转到非安全区域。
4.1.1创建用户任务
在freertos_tzm示例中,创建了两个用户任务,如图7所示。
当用户使用xTaskCreate()函数在非安全区域中创建任务时,将分配一个非安全任务堆栈。切换任务时,可以将非安全上下文存储在非安全任务堆栈中。
4.1.1.1分配安全堆栈
由于通过TrustZone技术将系统内存分为安全区域和非安全区域,因此在执行非安全任务时可以调用NSC功能。 因此,还需要为调用NSC功能以存储安全上下文的非安全任务分配安全堆栈。 首次执行非安全任务时,安全堆栈的分配完成,如图8所示。
调用portALLOCATE_SECURE_CONTEXT()函数时,将触发SVC中断,调用SecureContext_AllocateContext()函数(NSC函数)以在安全ucHeap阵列中分配安全空间作为此非安全任务的安全堆栈,以及PSP_S和PSPLIM_S 被初始化。
4.1.1.2定义NSC功能
创建任务后,用户需要定义任务功能。 如果非安全任务需要调用NSC函数,则它们还需要定义相应的NSC函数。 NSC功能在安全项目的nsc_functi
.........
完整版请查看>>>
|