我在 A9 芯片(Xilinx Zynq)中实现一个小型操作系统作为大学项目。我正在使用 trustzone 来实现一些功能,并且我想直接从用户模式通过 SVC 调用进行监控,因此我在我的 SVC 处理程序中发出了一个 SMC。这是矢量表加上处理程序的一个版本,它可以工作(为简单起见,我删除了其他处理程序代码):
secure_vectors:
ldr pc, _secure_reset
b _secure_undef
b _secure_svc
b _secure_prefAbort
b _secure_dataAbort
b . /* reserved for HYP mode - not supported */
b _secure_irq
b . /* reserved for MON mode */
_secure_undef:
b .
_secure_svc:
smc #0
movs pc, lr
_secure_prefAbort:
b .
_secure_dataAbort:
b .
_secure_irq:
b
但是,如果我将处理程序代码放在向量表之后,我会遇到问题。如果我将处理程序定位如下,有时不会发出 SMC 调用。调试时,我逐步执行指令,但好像从未发生过,因为监视器向量表没有收到 SMC 异常:
secure_vectors:
ldr pc, _secure_reset
b _secure_undef
b _secure_svc
b _secure_prefAbort
b _secure_dataAbort
b . /* reserved for HYP mode - not supported */
b _secure_irq
b . /* reserved for MON mode */
_secure_svc:
smc #0
movs pc, lr
_secure_undef:
b .
_secure_prefAbort:
b .
_secure_dataAbort:
b .
_secure_irq:
b
即使是在处理程序解决问题之前的“NOP”指令:
secure_vectors:
ldr pc, _secure_reset
b _secure_undef
b _secure_svc
b _secure_prefAbort
b _secure_dataAbort
b . /* reserved for HYP mode - not supported */
b _secure_irq
b . /* reserved for MON mode */
nop
_secure_svc:
smc #0
movs pc, lr
_secure_undef:
b .
_secure_prefAbort:
b .
_secure_dataAbort:
b .
_secure_irq:
b
我真的不明白为什么会这样。我错过了一些明显的东西吗?