首页 > 解决方案 > 为什么 arm-linux 切换到 SVC 模式来处理异常?

问题描述

手臂文档读取

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

在此处输入图像描述

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

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

在此处输入图像描述

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

谢谢!

标签: linux-kerneloperating-systemarminterrupt

解决方案


考虑这种情况:

当您在 IRQ 处理程序中然后执行 C 函数调用时,此时 LR 已更改;所以,如果你马上嵌套一个 IRQ,LR 就会损坏。


推荐阅读