linux-kernel - 为什么 arm-linux 切换到 SVC 模式来处理异常?
问题描述
这是因为新的中断随时可能发生,这会导致内核存储新中断的返回地址并覆盖原始中断。当原来的中断试图返回主程序时,会导致系统失败。为了防止这种情况,嵌套处理程序必须在重新启用中断之前更改为备用内核模式。
根据上下文,主要原因是新来的irq会覆盖R14(LR),导致第一个irq无法返回主程序。
据我了解,要解决这个问题,我只需在下一次 irq 提升之前将 R14(LR_irq)、SPSR_irq 推送到 R13(SP_irq) 即可。
在重新启用中断之前,嵌套处理程序无需切换到替代模式。
谢谢!
解决方案
考虑这种情况:
当您在 IRQ 处理程序中然后执行 C 函数调用时,此时 LR 已更改;所以,如果你马上嵌套一个 IRQ,LR 就会损坏。
推荐阅读
- sql-server - SQL Server 用@parameter 替换子查询
- python - 在 keras 中实现 Grad-Cam 时出现未连接的梯度错误
- mongodb - 在mongoDb中插入数据时收集锁
- openshift - 基于 Openshift buildconfig 中内部版本号的动态标签
- kotlin - KotlinJvmOptions 使用IR 选项
- apache-spark - 如何在火花中读取具有多个分隔符的 CSV 文件
- r - geom_col() 在 ggplot 中的值彼此接近
- php - SensioLabs 安全检查错误 Symfony 5
- c++ - 热像仪接口-evocortex回调函数问题
- saxon - JSON2XML:序言中不允许内容