operating-system - 从哪里从中断返回

标签 operating-system interrupt interrupt-handling context-switch

我已经阅读(并研究)了有关中断处理的内容。
我总是不明白的是,我们如何知道从中断处理程序返回到哪里(PC/IP)。
据我了解:

  1. 中断是由设备(例如键盘)引起的
  2. 相关处理程序在运行过程中被调用。也就是说,不执行到操作系统的上下文切换。
  3. 中断处理程序完成,并将控制权传递回正在运行的应用程序。

上面描述的过程是我对中断处理的理解,发生在当前正在运行的进程的上下文中。所以它类似于方法调用,而不是上下文切换。
然而,由于我们实际上并没有对中断处理程序进行调用,因此我们没有机会将当前 IP 推送到堆栈。
那么我们如何知道从中断跳回哪里。我很困惑。

希望得到任何解释,包括简单地指向专门解决此问题的良好 pdf/ppt 的单行文字。
[我通常指的是 Linux 和 C 代码下的上述过程 - 但欢迎所有好的答案]

最佳答案

它非常依赖于架构。

在 Intel 处理器上,当中断发生时,中断返回地址会被压入堆栈。您可以使用 iret 指令从中断上下文返回。

在 ARM 上,中断会导致处理器模式更改(例如,更改为 INTFIQSVC 模式),从而节省将当前CPSR(当前程序状态寄存器)放入SPSR(保存程序状态寄存器)中,将当前执行地址放入新模式的LR(链接寄存器)中,然后跳转到相应的中断向量。因此,从中断返回是通过将 SPSR 移入 CPSR,然后跳转到 LR 中保存的地址来完成的 - 通常使用 subsmovs 指令一步完成:

movs pc, lr

关于operating-system - 从哪里从中断返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9473625/

相关文章:

assembly - 如何判断电脑是否有组装中的XT/AT键盘?

python - 导入操作系统在 Linux 中不起作用

linux - 中断上下文下半部分(Softirq 或 tasklet)

c - 嵌入式C代码无法解释的语法错误;预期……在 '{' token 之前

c - stm32f051r8t6 TIM14 中断处理程序复位后不工作

c - 在 C 中使用子进程的 exec 命令执行 bin 程序

c - 使用 FUSE 在 C 中编写一个简单的文件系统

c - 如何修复在 EXTI9-5 上多次触发的中断?

bash - 即使我有一个应该阻止它的陷阱 INT,我的交互式 bash 脚本循环也会中断?

c - C程序中如何存储变量值?