为什么Linux(ARM)在异常处理期间总是切换到监管模式?

5

在异常处理期间,Linux总是切换到监管模式。这是为什么呢?为什么它不能在异常模式下继续执行?

3个回答

3
ARM处理器在发生异常时会切换到中止状态。在此状态下,处理器无法处理任何中断。这意味着屏幕和网络更新不能发生,也不能有任何抢占。因此,在中止状态下永远不应执行长时间运行的操作。
可能发生的情况是(我不是Linux内核专家),异常被记录并仅放置在队列中,异常处理程序立即返回。内核现在可以重新启用中断并处理所有高优先级任务。然后,它以不干扰其他任务的方式悠闲地处理异常。
我没有阅读过this article,但它似乎具有您正在寻找的详细信息。

Dorn,感谢您的解释。但是,我的问题更多地涉及Linux。除了“用户模式”之外的所有模式都是特权模式。那么,为什么Linux总是要切换到监管模式呢? - user997487
@Doron。所谓异常,并不仅指中止操作。ARM将影响程序执行的所有情况都定义为异常。例如,中断就是一种异常情况。因此,当发生中断时,ARM会切换到IRQ模式。IRQ模式是特权模式,可以访问所有系统资源,就像监管者模式一样。但即便如此,Linux仍然会转到监管者模式。 - user997487
出于同样的原因,当我们处于异常模式时,处理器无法接收其他异常。 - doron
这有点过于简化了。异常有优先级顺序,更高优先级的异常仍然可能发生。此外,一旦安全可行,异常处理程序可以重新启用中断(FIQ或IRQ)。我认为Linux总是切换到SVC的更简单的解释是它没有被设计成专门利用ARM处理器提供的所有模式。无论如何,系统调用将进入SVC,所以我想在那里做所有事情是有道理的。 - unixsmurf
1
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0013b/index.html,确实谈到了嵌套中断处理程序,但即便如此,该文档也指出,在重新启用中断之前,处理器必须更改状态。这是因为新的中断将覆盖LR_IRQ,使返回操作无法执行。 - doron
显示剩余2条评论

2

我可能有点晚回答这篇文章。

Linux内核的实现方式是这样的,每当第一级IRQ处理程序中发生任何中断,它会将IRQ寄存器复制到SVC寄存器,并将ARM切换到SVC模式。

这样做有两个主要目的:

  1. 您不需要为IRQ模式使用单独的堆栈
  2. 通过将其移回到SVC,您可以确保在SVC模式下处理另一个中断时可以同时处理其他中断。

0

对于IRQ模式,您仍需要一个堆栈,只是该堆栈非常小,因为我们基本上只需要在那里存储spsr和lr...但是是的,您是正确的,这将有助于支持嵌套中断,但这不是唯一的方法...我们可以从中断模式切换到系统模式(使用用户模式寄存器),仍然支持嵌套中断。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接