You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:22:09