四、为 Armv8-M 使用 TrustZone
-
关于Armv8-M



- STM32L5系列使用M33内核,LPC55S系列使用M33内核,GD32E23系列使用M23内核,这些处理器都是基于ARMv8-M架构
-
关于TrustZone
- TrustZone是ARM为了防止设备有效资源被拷贝、破坏或篡改,防止被恶意攻击,对资产包括有形和无形资产进行,以防止恶意软件、硬件监视、硬件干预等方式破坏或获取设备信息
- ARMv8-M比较重视安全,TrustZone是ARMv8-M的一项新安全技术(硬件层面)
- TrustZone 将软件硬件部分分为安全世界和正常世界,正常世界器件不可访问安全世界区域器件、存储空间等
- TrustZone近几年才用在对安全要求比较高的比如支付、数字版权、物联网等方面
- 目前暂时没有多少嵌入式芯片支持TrustZone,暂不展开讲解,具体移植参见,例子
五、CMSIS-核心设备模板
1. 模板包含以下内容
- 核心外设的寄存器名称和核心异常向量的名称
- 访问核心外设、特殊 CPU 指令和 SIMD 指令的函数(用于 Cortex-M4 和 Cortex-M7)
- 通用启动代码和系统配置代码
2. 一些文件路径
- 模板文件路径: .\CMSIS\Core\Include,例其中的core_cm4.h定义内核外设并提供访问内核寄存器的辅助函数
- 与设备相关的 CMSIS-Core 文件: .\Device\ARM,包括CMSIS-Core 处理器文件,示例设备在 CMSIS-Pack 描述文件ARM.CMSIS.pdsc中定义,例ARM Cortex–M4-ARMCM4-FP–具有浮点硬件的基于 Cortex-M4 的设备
3. 模板文件
-
芯片供应商应对模板文件进行扩展,以反映实际设备和设备外围设备
-
芯片供应商需将以下信息添加到这些模板文件中
- 设备外设访问层,为特定设备的外设提供定义
- Access Functions for Peripherals(可选),提供额外的帮助函数来访问特定于设备的外设
- 启动文件中特定于设备的中断向量
-
常用模板文件(本章4-8为对这些文件的描述)

- 以ToDo:开头的是注释,用于描述所需的修改
-
Armv8-M和Armv7-M的这个文件不一样
-
启动文件依赖于 CMSIS 编译器头文件中指定的特定编译器预处理器定义,例,__INITIAL_SP
-
__NO_RETURN:C11函数说明符,表明调用完成后函数不返回主调函数,以便编译器在优化时去掉不必要的函数返回代码,#define __NO_RETURN attribute((noreturn))
-
__GNUC__指的是GCC的版本
-
__INITIAL_SP:栈顶地址
Image$$ARM_LIB_STACK$$ZI$$Limit

-
__STACK_LIMIT:栈底(主堆栈指针限制值)
-
__set_MSPLIM:将给定值分配给主堆栈指针限制 ,仅适用于Armv8-M架构
-
__PROGRAM_START():进入用户应用程序或库启动的入口函数,类似LDR R0, =__main
-
__main() 和 main():__main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main(),慎用__main()
1. __main():完成代码和数据的拷贝,并把 ZI 数据区清零。代码拷贝可将代码拷贝到另外一个映射空间并执行 (例如将代码拷贝到 RAM 执行); 数据拷贝完成 RW 段数据赋值;数据区清零完成 ZI 段数据赋值。以上的代码和分散加载文件密切相关。
2. _rt_entry():进行 STACK 和 HEAP 等的初始化。最后_rt_entry跳进 main()函数入口。当 main()函数执行完后, _rt_entry 又将控制权交还给调试器。
-
__VECTOR_TABLE_ATTRIBUTE:用于定义静态(编译器时)中断向量表,例如将表标记为已使用并强制将其放入特定的链接器部分
-
NMI_Handler:不可屏蔽中断
-
scatter:文本文件,它可以用来描述ARM连接器生成映像文件时所需要的信息
-
文件内容和名字不一定和上面一样,例rt-thread的link.sct
-
在keil中查看sct路径方法:

- system_.c存放时钟或者PLL预分频相关内容,比如system_gd32f4xx.c的system_clock_config()
- system_.c也可以由供应商添加其它功能,比如电源配置
- 对应到GD32文件就是gd32f4xx.h
- 有一些定义比如__CM4_REV,如果没有在gd32f4xx.h中定义为1,会在core_CM4中有默认定义0
- 中断号定义:负 IRQn 值表示处理器内核异常(内部中断),正 IRQn 值表示特定于设备的异常(外部中断)
- 处理器和核心外设的配置:通过#define定义每个处理器内核的可能值,不同内核有自己的一组定义,比如core_cm4.h和core_cm7.h不一样
- CMSIS 版本和处理器信息:例__CM4_CMSIS_VERSION,#define __CORTEX_M (4U)
- 设备外设访问层:可能包含访问设备特定外设的功能,比如gd32f4xx.h的各个外设基地址
8. TrustZone 设置:partition_<设备>.h
- Armv8-M相关暂时用不到,关于安全相关的配置,暂不展开