Kernel ARM系统模式在嵌套中断中如何有用?

Kernel ARM系统模式在嵌套中断中如何有用?,kernel,arm,interrupt-handling,Kernel,Arm,Interrupt Handling,有人能给我解释一下,当我们有嵌套中断时,系统模式到底是如何工作的吗 根据ARM站点 ARMv4和更高版本的体系结构包括一种称为系统模式的特权模式,以克服此问题。系统模式与用户模式共享相同的寄存器,它可以运行需要特权访问的任务,异常不再覆盖链接寄存器 那么系统模式如何利用用户模式的寄存器呢 以及最高可处理的层次结构级别嵌套中断?尝试在IRQ模式下处理嵌套中断: (用户)如果您处于用户模式,您的PC注册表将显示您的位置 (用户)您得到一个中断 (IRQ)核心切换到中断模式,禁用中断(屏蔽通过 cp

有人能给我解释一下,当我们有嵌套中断时,系统模式到底是如何工作的吗

根据ARM站点

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

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


以及最高可处理的层次结构级别嵌套中断?

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

  • (用户)如果您处于用户模式,您的PC注册表将显示您的位置

  • (用户)您得到一个中断

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

  • (IRQ)在这个时刻,你不能得到更多的中断,因为中断是 残疾人

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

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

  • (IRQ)另一个中断发生,LR被函数处理中断覆盖。此时,您无法获得稳定的状态,原因很简单,您无法在IRQ模式下出于自己的目的使用LR,并且已启用中断以支持嵌套中断。您认为可以将LR保存到堆栈中,但这将导致非限定循环的竞争条件

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

  • (用户)如果您处于用户模式,您的PC注册表将显示您的位置

  • (用户)您得到一个中断

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

  • (IRQ)在这个时刻,你不能得到更多的中断,因为中断是 残疾人

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

  • (系统)另一个中断发生,但事情正常,只是因为你没有与硬件竞争以保持你的LR正常

查看哪些寄存器存储在哪些状态


如果你想巧妙地处理IRQ,你必须处理非常低级的asm,这是操作系统核心的一部分

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

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


另外,如果您只针对AAPC,则只能在条目中保存
{R0-R3,R12}
,因为C函数不会对
{R4-R11}

造成影响。注意,它讨论的是异常,而不是中断。中断是一种执行选项,但是,FIQ、数据中止、程序中止、未定义的异常等都是单独的模式。您可以将这些模式的状态,特别是
lr
spsr
保存到系统堆栈中,然后进入系统模式。此时,所有异常的所有代码都使用相同的堆栈。这是很有价值的,因为
sp
可以充当多个堆栈;为什么IRQ代码不能将当前上下文保存到中断堆栈中,然后启用中断?我认为可能需要一个变量来跟踪IRQ嵌套,因此当嵌套级别返回到零时,需要检查分派(用于此的另一个变量,如果IRQ处理程序调用取消阻止挂起任务的内核信号函数,则设置该变量)如果需要,将上下文切换到不同的用户任务。@rcgldr您不能在启用中断的IRQ模式下可靠地使用BL{X},这就是我的意思-任何其他时髦的解决方案是的,当然。@auselen您能再解释一下这行吗
您认为可以将LR保存到堆栈中,但这可能会导致非定义循环。
我需要知道会发生什么竞争条件?@auselen-是的,我记得的解决方法是在汇编中实现的,使用R12作为psuedo LR,知道R12不会被嵌套中断损坏。我还记得有两个迷你操作系统,其中“用户”代码在管理模式下运行,另一个也是这样,如您所述,对嵌套IRQ使用系统模式。@Rahul您在IRQ模式下启用了中断,您的PC可以说是0xA4,您执行BL 0xB4来执行调用,PC变为0xB4,LR变为0xA4。如果你想返回,你知道你可以使用LR。然而,就在另一个中断发生时,LR变为0xB4,您失去了原来的位置(您无法及时保存LR)。