这是我的理解:
- 当在用户模式下发生陷阱/系统调用时,寄存器将保存到内核堆栈上,切换到内核模式,处理陷阱并返回到用户模式。
- 当处于用户模式并且定时器中断关闭时,再次保存寄存器,切换到内核模式,并根据调度程序调度另一个进程,现在返回用户模式运行第二个进程。
但是如果进程 1 已经处于内核模式,然后定时器中断关闭怎么办?然后会发生什么?
答案1
一般来说(我不知道linux内核到底是如何实现的)如果触发任何中断,则停止任何正在运行的代码,保存所有寄存器,并且CPU运行处理中断的中断服务例程。之后寄存器被恢复并且代码继续执行。
防止这种情况发生的唯一方法是禁用中断,这通常在微控制器上完成以处理原子操作。通常,中断服务例程做的第一件事是禁用中断(因此它本身不能被中断),在完成其任务后,它做的最后一件事是重新启用中断。
我再次不熟悉 Linux 内核中中断服务例程的确切实现,但我希望它们以相同的方式工作。
就 x86 架构中从用户模式到内核模式的模式切换而言,我认为它的发生与此无关。假设 ISR 在内核模式下运行,因此 CPU 必须切换到它,这是可以避免的。如果它已经处于内核模式,则只需保存寄存器并跳转到 ISR。然后,它会以代码运行的任何模式恢复中断之前执行的任何代码。