为什么linux(ARM)在异常处理期间总是切换到监控模式?
在异常处理期间,Linux总是切换到监控模式。原因是什么?。为什么它不能在异常模式下继续执行 当ARM上发生异常时,处理器将切换到中止状态。在此状态下,处理器无法处理任何中断。这意味着屏幕和网络更新不能发生,也不能有任何先发制人。因此,永远不要在中止状态下执行长时间运行的操作 可能发生的情况(我不是linux内核专家)是,异常被记录并仅放置在一个队列中,异常处理程序立即返回。内核现在可以重新启用中断并处理所有高优先级任务。然后,它在空闲时以不中断其他任务的方式处理异常为什么linux(ARM)在异常处理期间总是切换到监控模式?,linux,arm,Linux,Arm,在异常处理期间,Linux总是切换到监控模式。原因是什么?。为什么它不能在异常模式下继续执行 当ARM上发生异常时,处理器将切换到中止状态。在此状态下,处理器无法处理任何中断。这意味着屏幕和网络更新不能发生,也不能有任何先发制人。因此,永远不要在中止状态下执行长时间运行的操作 可能发生的情况(我不是linux内核专家)是,异常被记录并仅放置在一个队列中,异常处理程序立即返回。内核现在可以重新启用中断并处理所有高优先级任务。然后,它在空闲时以不中断其他任务的方式处理异常 我没有读过,但它似乎有你想
我没有读过,但它似乎有你想要的那种细节。我在这篇文章中回答可能会迟到。 Linux内核实现就是这样做的,所以每当第一级IRQ处理程序中发生任何中断时,它都会将IRQ寄存器复制到SVC寄存器,并将ARM切换到SVC模式 这项工作已针对两个主要项目完成:
对于IRQ模式,您仍然需要一个堆栈,只是堆栈非常小,因为本质上我们只需要将spsr和lr存储在那里……但您是对的,这将有助于支持neseted中断,但这不是唯一的方法……我们可以切换到系统模式(使用用户模式寄存器)从中断模式,仍然支持嵌套中断Dorn,感谢您的解释。但是,我的问题更多的是关于linux。除“用户模式”之外的所有模式都已预编译。那么,为什么linux总是切换到管理模式呢?@Doron您已经将一个循环链接放到了您正在回答的同一个问题上:-):-):-):-@OP简言之,因为处于中止模式会阻止中断,所以我们尝试尽快返回。然后,我们需要进入主管模式来执行此操作cleanup@Doron. 我所说的例外,并不仅仅是指中止。ARM将异常定义为影响程序执行的所有异常。所以,对我来说。例如,中断是一种例外。所以,当中断发生时,ARM切换到IRQ模式。IRQ模式是预先设置的,可以访问所有系统资源,如管理器模式。但是,即使如此,Linux还是转到了supervisor模式。它确实谈到了嵌套的中断处理程序,但即使如此,文档中也说明了处理器必须在重新启用中断之前更改状态。这是因为新的中断将覆盖LR_IRQ,从而无法返回。