Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么linux(ARM)在异常处理期间总是切换到监控模式?_Linux_Arm - Fatal编程技术网

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

为什么linux(ARM)在异常处理期间总是切换到监控模式?,linux,arm,Linux,Arm,在异常处理期间,Linux总是切换到监控模式。原因是什么?。为什么它不能在异常模式下继续执行 当ARM上发生异常时,处理器将切换到中止状态。在此状态下,处理器无法处理任何中断。这意味着屏幕和网络更新不能发生,也不能有任何先发制人。因此,永远不要在中止状态下执行长时间运行的操作 可能发生的情况(我不是linux内核专家)是,异常被记录并仅放置在一个队列中,异常处理程序立即返回。内核现在可以重新启用中断并处理所有高优先级任务。然后,它在空闲时以不中断其他任务的方式处理异常 我没有读过,但它似乎有你想

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

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

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


我没有读过,但它似乎有你想要的那种细节。

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

这项工作已针对两个主要项目完成:

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

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

    Dorn,感谢您的解释。但是,我的问题更多的是关于linux。除“用户模式”之外的所有模式都已预编译。那么,为什么linux总是切换到管理模式呢?@Doron您已经将一个循环链接放到了您正在回答的同一个问题上:-):-):-):-@OP简言之,因为处于中止模式会阻止中断,所以我们尝试尽快返回。然后,我们需要进入主管模式来执行此操作cleanup@Doron. 我所说的例外,并不仅仅是指中止。ARM将异常定义为影响程序执行的所有异常。所以,对我来说。例如,中断是一种例外。所以,当中断发生时,ARM切换到IRQ模式。IRQ模式是预先设置的,可以访问所有系统资源,如管理器模式。但是,即使如此,Linux还是转到了supervisor模式。它确实谈到了嵌套的中断处理程序,但即使如此,文档中也说明了处理器必须在重新启用中断之前更改状态。这是因为新的中断将覆盖LR_IRQ,从而无法返回。