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使用周期都将在该进程的“记帐”下记帐。