问题描述
这里是我对进程切换的理解(在 amd64 Linux 中)。
- 触发了硬件中断或软件中断。
- 当前正在运行的进程的上下文被保存到它的 PCB 中。这包括程序计数器、堆栈指针、通用寄存器等。
- 运行中断例程处理程序。这反过来调用调度程序代码。调度程序将另一个进程上下文加载到寄存器中。
我对谁真正保存了中断进程的上下文感到困惑。 它不能是用户程序,因为它不知道什么时候会被抢占。 它不能是内核代码,因为首先要运行内核代码,程序计数器必须指向内核代码。如果这样做,您将丢失被中断进程的程序计数器。
解决方法
硬件将用户空间程序计数器保存在内核堆栈上,作为异常/中断在 x86 上工作的一部分。 (或者对于 syscall
入口点,用户空间 RIP 位于 RCX 中,并且必须手动存储到 PCB 中)。
用户空间上下文的其余部分在进入内核后由软件保存在该任务的内核堆栈中。上下文切换交换内核上下文包括内核堆栈指针指向新任务的堆栈,因此返回,最终到用户空间,将恢复新任务的用户空间状态。