arm 从一个模式切换到另一个模式为什么需要先备份lr寄存器的值
arm 7中模式下除user与sys模式外,其余5中模式各自有各自的单独的sp(r13),lr(r14),spsr。上电启动后,系统自动进入svc模式,此时设置sp栈是设置在svc模式下的栈。
当发生中断进入irq模式后,由于irq模式有单独的sp,故可以直接用ldr sp, #XXX设置irq模式下的栈,此栈不会与svc模式下设置的栈混淆,而在irq模式下进行的各种函数调用等需要
使用到栈的情形下,都是使用之前设置好的栈空间,因此当从svc模式进入irq模式下保护现场时,不存在需要对sp进行保护的说法。但需要对lr值进行保存备份。因为在进入irq后,irq下的lr寄存器保存的是svc模式下当时PC的值,即被中断的指令的下一条指令的地址+4(arm三级流水线时),lr中保存的该地址可用于中断程序处理完后,返回到被中断的指令处继续运行(sub lr, lr , #4, 经过此指令执行后lr中保存的是断点的下一条指令的地址)。而在irq模式下可能存在函数调用等情况,此时函数调用返回也需要lr寄存器来保存函数返回的地址,因此,lr之前保存svc下被中断的指令的下一条指令地址可能在irq模式下覆盖(irq模式下sp不存在被覆盖的情况),因此在现场保护程序中需要保存lr的值,可通过stm sp!, {r0~r12, lr}将r0一直到r12以及lr压进栈中保存,防止irq模式下有函数调用需要保存断点返回记录时,lr被覆盖,丢失中断返回的断点地址。

浙公网安备 33010602011771号