【问题标题】:Why does linux (ARM) always switch to supervisor mode during exception handling?为什么linux(ARM)在异常处理过程中总是切换到supervisor模式?
【发布时间】:2011-10-27 11:31:33
【问题描述】:

在异常处理期间,Linux 总是切换到超级用户模式。这是什么原因?为什么它不能在异常模式下继续执行?

【问题讨论】:

    标签: linux arm


    【解决方案1】:

    当 ARM 上发生异常时,处理器会切换到中止状态。在这种状态下,处理器不能处理任何中断。这意味着屏幕和网络更新不能发生,也不能有任何先发制人。出于这个原因,永远不应该在中止状态下执行长时间运行的操作。

    可能发生的情况(我不是 linux 内核专家)是异常被记录并仅放置一个队列,异常处理程序立即返回。内核现在可以重新启用中断并处理所有高优先级任务。然后,它会以不干扰其他任务的方式在闲暇时处理异常。

    我没有读过this article,但它似乎确实有你正在寻找的那种细节。

    【讨论】:

    • 多恩,感谢您的解释。但是,我的问题更多是针对 linux 的。除“用户模式”外的所有模式均优先。那么,为什么linux总是切换到supervisor模式呢?
    • @Doron 你已经为你正在回答的同一个问题放置了一个循环链接:-) :-) :-)
    • @OP 简而言之,因为处于中止模式会阻止中断,所以我们尝试尽快返回。然后我们需要进入主管模式进行清理
    • @Doron。作为例外,我的意思不仅仅是中止。 ARM 将异常定义为所有影响程序执行的异常。因此对于。例如,中断是一个例外。因此,当中断发生时,ARM 切换到 IRQ 模式。 IRQ 模式是 previleged 并且可以访问所有系统资源,如主管模式。但是,即便如此,Linux 仍会切换到超级用户模式。
    • infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0013b/…,确实谈到了嵌套的中断处理程序,但即便如此,文档指出处理器必须在重新启用中断之前更改状态。这是因为新的中断会覆盖 LR_IRQ,导致无法返回。
    【解决方案2】:

    我可能会迟到在这篇文章中回答。 Linux 内核实现就是这样做的,因此每当第一级 IRQ 处理程序发生任何中断时,它都会将 IRQ 寄存器复制到 SVC 寄存器并将 ARM 切换到 SVC 模式。

    这主要有两个目的:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        相关资源
        最近更新 更多