TrustZone中中断配置引发的一个问题
我们在前面文章中已经简单的写到,TrustZone模式下,中断是可以自由的配置产生Secure中断还是Non-Secure中断,这个可以在NVIC->ITNS
一系列寄存器中进行配置,现在我们就遇到了这样一个问题。
问题描述
这个问题也是在测试中发现的,具体是在测一个memory保护模块时产生的。Memory保护模块可以让用户自主的配置一个Memory或者外设是Secure还是Non-Secure的,如果用户产生了非法的访问将会产生相应的中断。我们在测试中会用到一个LPUART模块,为了测试方便,Secure和Non-Secure模式下面LPUART使用的是同一个,并且这个LPUART接受Memory保护单元保护。在测试的时候,LPUART首先是Seucre访问的,当需要跳转到Non-Secure的时候,再把LPUART配置为Non-Secure,这样系统运行起来似乎是没什么问题的。
但是我们在测试访问被保护Memory空间内容会产生中断这个功能的时候,一般我们产生了HardFault之后会把PC指针加4,也就是跳转到下一条指令,这样就不会连续产生中断了。之前的Case这样跑都没有问题,但是这里,PC却一直跳转,一直产生中断。
问题分析
出现问题时候,我们依然选择从汇编上开始入手调试,调试过程中,我们发现系统在中断产生的时候会在Secure和Non-Secure状态进行切换,切换之后PC新的值会跳到Secure空间,这个时候CPU还是Non-Secure的,所以访问Secure空间就会产生中断,因为这个中断无法正常消除,所以中断也会不停产生。
至于为什么会在Secure和Non-Secure状态切换呢?毕竟往Secure空间跳转是一个比较复杂的过程,仔细分析发现,跳转到Secure状态实际上是产生了Secure中断。后面我们了解到访问Memory保护空间异常的时候,除了HardFault之外,还会产生一个Memory保护的异常,并且在Memory保护模块会产生一个中断标志,用户需要在中断中将这个标志清除,否则会连续产生中断。嗯,这个现象也是类似的。
看来是Memory保护中断没产生呀,刚好研究NVIC->ITNS
,那就试试把中断配置到Non-Secure空间吧,编译下载一条龙,结果Non-Secure中断确实产生了,但是还是一直产生中断。原来Memory保护中的中断请求只能在Secure模式下清除,所以还是要产生Secure中断才行,不过之前好像就是Secure中断呀,应该可以正常工作才对。
没办法,只好打个断点试试了,TrustZone的程序真是不好调试,至今还没找到Secure和Non-Secure联调的方法。Secure中加个断点来一发,观测站汇报进入断点,断点程序执行正常,断点打印。。。。。异常!原来中断中有Printf语句,这个语句会调用LPUART,而这个时候LPUART是Non-Secure访问的,Secure模式访问会出现异常。这个扯淡的设计。
问题解决
没办法,既然LPUART只能Non-Secure访问,那么要么Non-Secure和Secure各用一个串口,要么Secure交出权利之后就不要再随便篡权了,中断里面就亮亮灯什么的就好了,别乱说话了。至此,Secure的输出屏蔽之后,看起来一切正常。
最后更新于 2019-11-20 23:19:15 并被添加「TrustZone C 中断 解Bug」标签,已有 3447 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。