ARMv8-m TrustZone调用非安全代码后触发INVTRAN崩溃如何解决?
RP2350 TrustZone 跨域分支标记问题
问题背景
在RP2350微控制器上使用TrustZone,已通过SAU配置安全与非安全内存区域,尝试用bxns指令跳转至非安全代码。非安全固件有独立向量表,获取入口地址的代码如下:
uint32_t *image_base = ...; uint32_t sp = image_base[0]; uint32_t pc = image_base[1]; __asm__( "msr msp_ns, %0\n\t" "bxns %1" : : "r" (sp), "r" (pc) : "memory");
执行bxns后CPU进入崩溃处理程序,SFSR值为0x00000010,对应INVTRAN错误:
Invalid transition flag. Sticky flag indicating that an exception was raised due to a branch that was not flagged as being domain crossing causing a transition from Secure to Non-secure memory.
(翻译:无效转换标志。该粘性标志表示因未标记为域交叉的分支引发异常,导致从安全内存切换到非安全内存。)
解决方法
1. 修正目标地址的Thumb模式标记
RP2350采用Thumb-2指令集,所有代码必须运行在Thumb模式。ARM TrustZone要求bxns的目标地址最低位(bit0)必须置1,以此标记这是一个Thumb模式的跨域分支。你需要确保传入bxns的pc值bit0为1:
- 若非安全向量表的入口地址本身是偶数(bit0为0),需手动将其置1后再执行跳转。
修改后的代码示例:
uint32_t *image_base = ...; uint32_t sp = image_base[0]; // 强制设置地址最低位为1,标记为Thumb模式跨域分支 uint32_t pc = image_base[1] | 0x1; __asm__( "msr msp_ns, %0\n\t" "bxns %1" : : "r" (sp), "r" (pc) : "memory");
2. 验证SAU配置有效性
- 确认非安全固件的向量表、代码段、栈区域全部被SAU标记为非安全内存范围;
- 检查
SAU_CTRL寄存器的使能位是否已正确置1,确保SAU配置生效。
3. 检查非安全栈指针合法性
确保sp(非安全主栈指针)指向的内存属于SAU定义的非安全区域,且地址满足ARM 8字节对齐要求。
内容的提问来源于stack exchange,提问作者jpa
相关产品推荐
相关产品推荐

