赞
踩
Trust Zone M特性简介
TrustZone是ARM-v8M内核推出的安全特性,严格来讲叫做TrustZone-M,因为CortexA系列的TrustZone功能早已存在多年,而且TrustZone-M更偏向于嵌入式场景,跟TrustZone差别还是很大的.
Cortex M23,Cortex M33, Cortex M35是目前基于v8M内核的几款内核, STM32U575的内核是CortexM33.
TrustZone-M特性是厂商可以选择的一个特性,如果不实现这个特性,M33和M4/M7类似.
file:///C:/Users/Lenovo/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg
如果实现了TrustZone-M,则有一些附加的IP.
可以看到从IP上看,MPU变成了MPU_S/MPU_NS两个IP,另外多了SAU.
STM32U5系列的MCU是实现了TrustZone-M这个特性的,所以有SAU,MPU_S,MPU_NS这些单元.
值得一提的是,STM32U5的TrustZone-M特性是通过OptionBit控制的,如果不需要TrustZoneM特性,可以进行关闭,这时M33内核与M4,M7内核差不多.
对于TrustZone M这个特性,如下几点可以帮助读者建立初步概念:
关于Trust Zone M,内容太多, 本贴只能简要解绍下,STM32U5芯片如何创建一个支持TrustZone的工程.
第一步, 修改Option Bit
TZEN最重要的, 不使能的话, 该芯片无Trust Zone-M特性, 跟M4/M7类似. 要使用该特性的话,把这个勾上.
我们把0x80000000开始到0x8100000的区间配置为了Secure区, 后面Secure区间的代码放在这个区间, 其余区间存放Non-Secure区间的代码.注意对于Secure区间的代码烧写,要指定一个偏移量把0x8000000的地址偏移到0xC000000上去, 这是STM32U5特殊的配置.
第二步-创建CubeMX工程, 划分外设
创建工程时就需要指定是否使用TrustZone, 使用TrustZone时实际上创建了两个工程, Secure和Non-Secure版本.
再来指定外设
第一步,我们故意把HASH IP分给Non-Secure区, RNG IP分给Secure区. 这种情况下, Non-Secure区不能直接访问RNG这个IP的.
之后按照常规生成代码, 会生成两个工程, 分别对应Secure和Non Secure区间.
两个工程的ROM区和RAM区不要重合.
Secure区:
其下载配置:
Non-Secure区:
其下载配置:
先构建Secure区并下载,再构建Non-Secure区并下载:
简单看看代码从Secure区跳到Non-Secure区的跳转点:
芯片上电后来到Secure区内,代码与一般CortexM工程无异:
- int main(void)
-
- {
-
- /* SAU/IDAU, FPU and interrupts secure/non-secure allocation setup done */
-
- /* in SystemInit() based on partition_stm32u575xx.h file's definitions. */
-
- /* USER CODE BEGIN 1 */
-
-
-
- /* USER CODE END 1 */
-
-
-
- /* MCU Configuration--------------------------------------------------------*/
-
-
-
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
-
- HAL_Init();
-
-
-
- /* USER CODE BEGIN Init */
-
-
-
- /* USER CODE END Init */
-
-
-
- /* Configure the system clock */
-
- SystemClock_Config();
-
-
-
- /* Configure the System Power */
-
- SystemPower_Config();
-
- /* GTZC initialisation */
-
- MX_GTZC_S_Init();
-
-
-
- /* USER CODE BEGIN SysInit */
-
-
-
- /* USER CODE END SysInit */
-
-
-
- /* Initialize all configured peripherals */
-
- MX_GPIO_Init();
-
- /* USER CODE BEGIN 2 */
-
-
-
- /* USER CODE END 2 */
-
-
-
- /*************** Setup and jump to non-secure *******************************/
-
-
-
- NonSecure_Init();
-
但是NonSecure_Init这个函数不会返回, 会跳转到Non-Secure区, 类似于BootLoader->Application跳转.
- /**
-
- * [url=home.php?mod=space&uid=247401]@brief[/url] Non-secure call function
-
- * This function is responsible for Non-secure initialization and switch
-
- * to non-secure state
-
- * @retval None
-
- */
-
- static void NonSecure_Init(void)
-
- {
-
- funcptr_NS NonSecure_ResetHandler;
-
-
-
- SCB_NS->VTOR = VTOR_TABLE_NS_START_ADDR;
-
-
-
- /* Set non-secure main stack (MSP_NS) */
-
- __TZ_set_MSP_NS((*(uint32_t *)VTOR_TABLE_NS_START_ADDR));
-
-
-
- /* Get non-secure reset handler */
-
- NonSecure_ResetHandler = (funcptr_NS)(*((uint32_t *)((VTOR_TABLE_NS_START_ADDR) + 4U)));
-
-
-
- /* Start non-secure state software application */
-
- NonSecure_ResetHandler();
-
- }
-
这时Non-Secure区工程没有RNG的初始化代码, 我们做一点Hack, 把HAL库里的RNG初始化和使用代码拷贝到Non-Secure工程中进行随机数生成并打印:
- /****************************************************************************/
-
- /*************************** Hash-SHA256
-
- * ***************************************/
-
- /****************************************************************************/
-
- if (HAL_HASH_DeInit(&hhash) != HAL_OK) {
-
- Error_Handler();
-
- }
-
- MX_HASH_Init();
-
-
-
- if (HAL_HASHEx_SHA256_Start(&hhash, (uint8_t *)aInput, INPUT_TAB_SIZE,
-
- aHashDigest, 0xFF) != HAL_OK) {
-
- Error_Handler();
-
- }
-
- printf("Hash-SHA256 test passed.\n");
-
- print_hex(aHashDigest, 32);
-
-
-
- while (1)
-
- {
-
- halStatus = HAL_RNG_GenerateRandomNumber(&hrng, &random32bit);
-
- printf("%p %u %u\n", main, SystemCoreClock, HAL_GetTick());
-
- printf("%u, %p %08X\n", halStatus, &random32bit, random32bit);
-
- HAL_Delay(3000);
-
可以看到随机数生成函数返回错误:
- Core Freq:160000000 Hz
-
- Hash-SHA1 test passed.
-
- F859C18DEC9472427924FB61EF7C6A6B670BF9C3
-
- Hash-MD5 test passed.
-
- 6707862C7CD0B522B2DD22D8477BE318
-
- Hash-SHA224 test passed.
-
- 76CCDD1FDE036CDE39C9D23CE6BDB169FF743B89D15791BFBA109A55
-
- Hash-SHA256 test passed.
-
- 9691CF47C93807990B049AD4D2E7F60133AB48AADA53A80889A3DA46170F4AFE
-
- 081026d5 160000000 3
-
- 1, 200461e4 713A21DC
-
第三步, 重新划分外设
这一次把RNG也分给Non-Secure区间, 再次生成代码,构建下载, 这样就可以看到随机数生成函数正确返回了.
- Core Freq:160000000 Hz
-
- Hash-SHA1 test passed.
-
- F859C18DEC9472427924FB61EF7C6A6B670BF9C3
-
- Hash-MD5 test passed.
-
- 6707862C7CD0B522B2DD22D8477BE318
-
- Hash-SHA224 test passed.
-
- 76CCDD1FDE036CDE39C9D23CE6BDB169FF743B89D15791BFBA109A55
-
- Hash-SHA256 test passed.
-
- 9691CF47C93807990B049AD4D2E7F60133AB48AADA53A80889A3DA46170F4AFE
-
- 081026d5 160000000 3
-
- 0, 200461e4 57FD111A
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。