Linux kernel 为什么arm linux切换到SVC模式来处理异常?

Linux kernel 为什么arm linux切换到SVC模式来处理异常?,linux-kernel,operating-system,arm,interrupt,Linux Kernel,Operating System,Arm,Interrupt,这是因为在任何时候都可能发生新的中断,这将导致 存储新中断的返回地址并覆盖原始中断的核心。 当原始中断试图返回主程序时,将导致系统停止 失败。在重新启用之前,嵌套处理程序必须更改为备用内核模式 为了防止这种情况而中断 根据上下文,主要原因是新的irq将覆盖R14(LR),因此第一个irq无法返回主程序 在我的理解中,为了解决这个问题,我只需要在下一次irq提升之前将R14(LR_irq)、SPSR_irq推送到R13(SP_irq) 在重新启用中断之前,嵌套处理程序不需要切换到替代模式 谢谢

这是因为在任何时候都可能发生新的中断,这将导致 存储新中断的返回地址并覆盖原始中断的核心。 当原始中断试图返回主程序时,将导致系统停止 失败。在重新启用之前,嵌套处理程序必须更改为备用内核模式 为了防止这种情况而中断

根据上下文,主要原因是新的irq将覆盖R14(LR),因此第一个irq无法返回主程序

在我的理解中,为了解决这个问题,我只需要在下一次irq提升之前将R14(LR_irq)、SPSR_irq推送到R13(SP_irq)

在重新启用中断之前,嵌套处理程序不需要切换到替代模式


谢谢大家!

标题和文本可能重复,这有点令人困惑;文本是关于重入中断的,而您的标题是关于模式切换的。上面的链接解释了正在发生的事情。Linux切换到SVC,因此它可能有一个公共堆栈。所有代码都将堆栈用作线程信息/当前PID的8k锚点。LR_Irq存储在SVC堆栈上,保存后可能会发生嵌套中断(如果您的linux是这样配置的)。IRQ绝对可以中断内核代码。只有一些配置允许嵌套中断(也称为实时、桌面、服务器选项可能会影响这一点)。