![当进程处于内核模式时发生上下文切换时会发生什么?](https://linux22.com/image/128883/%E5%BD%93%E8%BF%9B%E7%A8%8B%E5%A4%84%E4%BA%8E%E5%86%85%E6%A0%B8%E6%A8%A1%E5%BC%8F%E6%97%B6%E5%8F%91%E7%94%9F%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E6%97%B6%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F.png)
这是我的理解:
- 当在用户模式下发生陷阱/系统调用时,寄存器将保存到内核堆栈上,切换到内核模式,处理陷阱并返回到用户模式。
- 当处于用户模式并且定时器中断关闭时,再次保存寄存器,切换到内核模式,并根据调度程序调度另一个进程,现在返回用户模式运行第二个进程。
但是如果进程 1 已经处于内核模式,然后定时器中断关闭怎么办?然后会发生什么?
答案1
一般来说(我不知道linux内核到底是如何实现的)如果触发任何中断,则停止任何正在运行的代码,保存所有寄存器,并且CPU运行处理中断的中断服务例程。之后寄存器被恢复并且代码继续执行。
防止这种情况发生的唯一方法是禁用中断,这通常在微控制器上完成以处理原子操作。通常,中断服务例程做的第一件事是禁用中断(因此它本身不能被中断),在完成其任务后,它做的最后一件事是重新启用中断。
我再次不熟悉 Linux 内核中中断服务例程的确切实现,但我希望它们以相同的方式工作。
就 x86 架构中从用户模式到内核模式的模式切换而言,我认为它的发生与此无关。假设 ISR 在内核模式下运行,因此 CPU 必须切换到它,这是可以避免的。如果它已经处于内核模式,则只需保存寄存器并跳转到 ISR。然后,它会以代码运行的任何模式恢复中断之前执行的任何代码。