上下文切换时如何保存当前上下文?

How is current context saved during context switching?

这里是我对进程切换的理解(在amd64中Linux)。

  1. 触发了硬件中断或软件中断。
  2. 当前 运行ning 进程的上下文已保存到其 PCB 中。这包括程序计数器、堆栈指针、通用寄存器等
  3. 中断例程处理程序是 运行。这又会调用调度程序代码。调度程序将另一个进程上下文加载到寄存器中。

我很困惑到底是谁保存了被中断进程的上下文。 不可能是用户程序,因为它不知道什么时候会被抢占。 它不能是内核代码,因为首先 运行 内核代码,程序计数器必须指向内核代码。如果这样做,您将丢失被中断进程的程序计数器。

硬件将 user-space 程序计数器保存在内核堆栈上,作为异常/中断在 x86 上工作方式的一部分。 (或者对于 syscall 入口点,user-space RIP 在 RCX 中并且必须手动存储到 PCB 中)。

user-space上下文的其余部分在进入内核后由软件保存在该任务的内核堆栈中。上下文切换交换内核上下文 包括指向新任务堆栈的内核堆栈指针 ,因此最终返回到 user-space,将恢复新任务的 user-space状态。