ARM系统模式如何在嵌套中断中起作用?

时间:2014-03-19 06:44:54

标签: kernel arm interrupt-handling

有人可以解释一下,当我们有嵌套中断时系统模式究竟是如何工作的吗?

根据ARM网站

  

ARMv4及更高版本的体系结构包括称为系统模式的特权模式,以克服此问题。系统模式与用户模式共享相同的寄存器,它可以运行需要特权访问的任务,异常不再覆盖链接寄存器。

那么系统模式如何利用用户模式的寄存器?

可以处理嵌套中断的层次结构吗?

2 个答案:

答案 0 :(得分:3)

尝试在IRQ模式下处理嵌套中断:

  • (USER)您处于用户模式,您的PC注册表明您的位置。

  • (USER)你得到一个中断。

  • (IRQ)内核切换到中断模式,禁用中断(屏蔽通过 cpsr.i)在IRQ模式下将PC从用户模式保存到LR。

  • (IRQ)此时您无法获得更多中断,因为中断是 禁用。

  • (IRQ)您处于IRQ模式,并且您启用了中断。

  • (IRQ)您调用函数来处理相关的中断。函数调用LR包含后,将地址返回到顶级IRQ处理程序。

  • (IRQ)发生另一个中断,LR被函数处理中断覆盖。此时您无法获得稳定状态,只是因为您无法在IRQ模式下将LR用于您自己的目的并且启用了中断以支持嵌套中断。你认为你可以将LR保存到堆栈中,但是这会对竞争条件产生影响,这会导致不可信的循环。

通过系统模式处理嵌套中断:

  • (USER)您处于用户模式,您的PC注册表明您的位置。

  • (USER)你得到一个中断。

  • (IRQ)内核切换到中断模式,禁用中断(屏蔽通过 cpsr.i)在IRQ模式下将PC从用户模式保存到LR。

  • (IRQ)此时您无法获得更多中断,因为中断是 禁用。

  • (IRQ)您切换到系统模式,启用IRQ。

  • (系统)发生了另一个中断,但事情的发生只是因为你没有与硬件比赛以保持你的LR健全。

Look below查看哪些寄存器在哪些状态下存储。

enter image description here

答案 1 :(得分:0)

如果你想要嵌套处理IRQ,你必须处理非常低级别的asm,这是操作系统核心的一部分。

回到代码。我假设您对ARM核心寄存器有所了解。嵌套IRQ最重要的是保存ISR将返回的状态。当IRQ发生时,CPU会将旧CPSR保存到SPSR_irq,将旧PC保存到LR_irq,并且将禁用IRQ。因此,在进入真正的ISR之前,您必须将{R0-R12}LR_irqSPSR_irq推入堆栈。注意,IRQ现在被禁用,没有任何东西会打扰你(除非FIQ,但FIQ使用其他一组不干扰IRQ寄存器的寄存器)。之后,您可以安全地跳转到真正的ISR并启用IRQ。

从ISR返回时,禁用IRQ,并从堆栈中检索SPSR,然后执行LDM {R0-R12,PC}^将从中断发生的地方返回。

P.S。如果您只定位AAPCS,则只能在条目中保存{R0-R3, R12},因为C函数不会破坏{R4-R11}