中断和上下文切换

Interrupts and context switches

我正在阅读一些关于 OS 实现的论文和源代码,并且对此有疑问。 在 github 上发现的某些操作系统中,上下文切换是在定时器中断的中断处理中进行的。 他们保存了寄存器 rbx, r12, r13, r14, r15, rbprsp,并从下一个线程的保存状态中恢复了这些寄存器。

在调用 iret 之前,这些线程切换是在定时器中断处理例程中进行的。我的问题是:当中断处理程序恢复上述寄存器时,为什么调用 iret?切换线程时,下一个线程将立即启动 - 或者他是在使用 iret 调用完成中断处理程序后启动?

When the mentioned registers were recovered by the interrupt handler, why is the iret called? On switching the thread, the next thread will start immediately

你说,"on switching the thread," 但 iret 指令是 使 线程切换发生的原因。

or is he starting after finishing the interrupt handler with the iret call?

不要将 iret 视为 "return from interrupt.",而是将其视为 "restore execution context"。它将堆栈中的单词弹出到重要的上下文寄存器中,始终包括程序计数器,并且可能包括定义虚拟地址 space 和特权级别的寄存器。 CPU 在 iret 之后执行的下一条指令将是来自新恢复的上下文的指令。

iret 从堆栈中弹出的已保存上下文恰好与硬件中断推送的格式 相同,但这并不意味着您可以只弹出由最近的硬件中断推送的上下文。您可以弹出一个早前推送的上下文,然后保存在某个 "thread" 数据结构中。您甚至可以弹出一个从无到有的全新上下文以启动一个新线程。

When the mentioned registers where recovered by the interrupt handler, why is the iret called?

IRET returns 进程进入导致其进入内核模式的异常或中断之前的状态。

您看到的寄存器开关改变了进程上下文,但那是进程在内核模式处理程序中时的状态。 IRET 指令然后 returns 进程状态到它在用户模式下的状态。