我已经阅读(并研究)了有关中断处理的内容。
我总是不明白的是,我们如何知道从中断处理程序返回到哪里(PC/IP)。
据我了解:
- 中断是由设备(例如键盘)引起的
- 相关处理程序在运行过程中被调用。也就是说,不执行到操作系统的上下文切换。
- 中断处理程序完成,并将控制权传递回正在运行的应用程序。
上面描述的过程是我对中断处理的理解,发生在当前正在运行的进程的上下文中。所以它类似于方法调用,而不是上下文切换。
然而,由于我们实际上并没有对中断处理程序进行调用,因此我们没有机会将当前 IP 推送到堆栈。
那么我们如何知道从中断跳回哪里。我很困惑。
希望得到任何解释,包括简单地指向专门解决此问题的良好 pdf/ppt 的单行文字。
[我通常指的是 Linux 和 C 代码下的上述过程 - 但欢迎所有好的答案]
最佳答案
它非常依赖于架构。
在 Intel 处理器上,当中断发生时,中断返回地址会被压入堆栈。您可以使用 iret
指令从中断上下文返回。
在 ARM 上,中断会导致处理器模式更改(例如,更改为 INT
、FIQ
或 SVC
模式),从而节省将当前CPSR(当前程序状态寄存器)放入SPSR(保存程序状态寄存器)中,将当前执行地址放入新模式的LR(链接寄存器)中,然后跳转到相应的中断向量。因此,从中断返回是通过将 SPSR 移入 CPSR,然后跳转到 LR 中保存的地址来完成的 - 通常使用 subs
或 movs
指令一步完成:
movs pc, lr
关于operating-system - 从哪里从中断返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9473625/