Linux kernel ARM中的嵌套中断处理

Linux kernel ARM中的嵌套中断处理,linux-kernel,arm,Linux Kernel,Arm,下面是Cortex A Prog指南中提到的流程,我对本文有几个问题 因此,可重入中断处理程序必须在引发IRQ异常并以前面描述的方式将控制转移到中断处理程序后执行以下步骤 •中断处理程序保存中断程序的上下文(即,它将处理程序损坏的任何寄存器(包括返回地址和SPSR_IRQ)推送到备用内核模式堆栈上) •确定需要处理的中断源,并清除外部硬件中的中断源(防止其立即触发另一个中断) •中断处理程序将处理器更改为其他内核模式,保留CPSR I位设置(中断仍被禁用) •中断处理程序将异常返回地址保存在堆栈

下面是Cortex A Prog指南中提到的流程,我对本文有几个问题

因此,可重入中断处理程序必须在引发IRQ异常并以前面描述的方式将控制转移到中断处理程序后执行以下步骤

•中断处理程序保存中断程序的上下文(即,它将处理程序损坏的任何寄存器(包括返回地址和SPSR_IRQ)推送到备用内核模式堆栈上)

•确定需要处理的中断源,并清除外部硬件中的中断源(防止其立即触发另一个中断)

•中断处理程序将处理器更改为其他内核模式,保留CPSR I位设置(中断仍被禁用)

•中断处理程序将异常返回地址保存在堆栈上(新模式的堆栈,位于内核内存中),并重新启用中断

Q> Are there 2 stacks here ?
•它为原始中断调用适当的C处理程序(中断仍然被禁用)

•完成后,中断处理程序禁用IRQ并从堆栈中弹出异常返回地址

•它直接从备用内核模式堆栈恢复中断程序的上下文。这包括恢复PC和CPSR(切换回以前的执行模式)

Q> How is the nesting done here ? I am bit confused here...
1) 由你决定,真的。要求是它不能被异步调用。因此,您可以使用系统模式堆栈,它与用户模式共享,具有一些有趣的含义。或者,只要在执行SVC指令之前始终正确存储所有上下文,就可以使用管理器模式堆栈

2) 对

3) 是的,您将上下文存储在(1)中选择的任何模式的堆栈上


4) 在替代模式下执行时,重新启用中断(如文本状态所示)。此时,处理器将对发送到内核的新中断做出反应——通常是中断控制器中配置的优先级更高的中断。

您的问题总是令人困惑。您是在谈论Linux的工作方式,还是他们希望改变Linux的工作方式?如果我回答你的问题,你只需再问20个。请参阅:。一个典型的内核有一个用于正常工作的堆栈。对于每项任务,它经常被切换(特别是w Linux)。您在entry-armv.S中询问了另一个关于
irq\u svc
等的问题。这在问题的顶部有一个问题。如果我们想要嵌套,数组必须更大;取决于你怎么做。没有一种方法可以打断手臂;它们给了我们作为系统程序员的灵活性。书籍中缺乏文档和混乱的文档/手册会产生问题,因此如果我问一个问题,然后试图将其联系起来,它就不适合。这里的问题是Cortex A解释了一种方法,而linux选择了另一种方法。我正在实现一个裸机RTOS,所以当我参考linux时,问题就来了。
Q> Are there 2 stacks here ?
Q> How is the nesting done here ? I am bit confused here...