2

我在 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   

我真的不明白为什么会这样。我错过了一些明显的东西吗?

4

0 回答 0