Operating system 中断后返回的位置

Operating system 中断后返回的位置,operating-system,interrupt,interrupt-handling,context-switch,Operating System,Interrupt,Interrupt Handling,Context Switch,我已经阅读(并研究)了中断处理。 我一直不明白的是,我们如何知道从中断处理程序返回(PC/IP)的位置。 据我了解: 中断是由设备(如键盘)引起的 在正在运行的进程下调用相关的处理程序。也就是说,不执行到操作系统的上下文切换 中断处理程序完成,并将控制权传递回正在运行的应用程序 上面描述的过程是我对中断处理的理解,它发生在当前运行过程的上下文中。因此,它类似于方法调用,而不是上下文切换。 然而,由于我们实际上没有调用中断处理程序,因此我们没有机会将当前IP推送到堆栈中。 那么,我们如何知道从中断

我已经阅读(并研究)了中断处理。
我一直不明白的是,我们如何知道从中断处理程序返回(PC/IP)的位置。
据我了解:

  • 中断是由设备(如键盘)引起的
  • 在正在运行的进程下调用相关的处理程序。也就是说,不执行到操作系统的上下文切换
  • 中断处理程序完成,并将控制权传递回正在运行的应用程序
  • 上面描述的过程是我对中断处理的理解,它发生在当前运行过程的上下文中。因此,它类似于方法调用,而不是上下文切换。
    然而,由于我们实际上没有调用中断处理程序,因此我们没有机会将当前IP推送到堆栈中。
    那么,我们如何知道从中断中跳回到哪里呢。我很困惑

    如果您能提供任何解释,包括一行简单地指向专门解决此问题的好pdf/ppt的话,我们将不胜感激。

    [我通常指的是Linux和C代码下的上述过程-但欢迎所有好的答案]

    CPU中的中断触发机制将返回地址推送到堆栈上(除其他外)。

    当触发中断时,CPU将几个寄存器推送到堆栈上,包括指令指针(EIP)在中断之前执行的代码的。您可以放置
    iret
    和ISR的末尾以弹出这些值,并恢复EIP(以及CS、EFLAGS、SS和ESP)


    顺便说一下,中断不一定是由设备触发的。在Linux和DOS中,用户空间程序使用中断(通过
    int
    )进行系统调用。一些内核代码使用中断,例如故意三重故障来强制关闭。

    这与体系结构有关

    在英特尔处理器上,当中断发生时,中断返回地址被推送到堆栈上。您可以使用
    iret
    指令从中断上下文返回

    在ARM上,中断导致处理器模式更改(例如,更改为
    INT
    FIQ
    SVC
    模式),将当前CPSR(当前程序状态寄存器)保存到SPSR(保存的程序状态寄存器)中,将当前执行地址放入新模式的LR(链接寄存器)中,然后跳到适当的中断向量。因此,通过将SPSR移动到CPSR中,然后跳转到保存在LR中的地址,可以从中断返回-通常通过
    subs
    movs
    指令一步完成:

    movs pc, lr
    

    这完全依赖于系统,依赖于英特尔。不过,在任何其他架构上都没有。有点迂腐,但上面的第(2)点并不是这么说的。在中断时,内核肯定会在环0内核代码中切换到“操作系统”。内核可以在不改变CR3页表指针的情况下为中断提供服务,因此在这种意义上没有上下文切换。由于这个原因,用户进程都映射了全局内核页表。@srking:我将重新学究一次-很明显,处理程序已在操作系统中注册。此外,在任何正常情况下,处理程序本身都将位于内核地址空间中。但是,正在运行的进程将保持运行-是的,没有上下文切换。此外,任何CPU使用周期都将在该进程的“记帐”下记帐。