![内核进程切换到用户模式时是否需要保存一些东西?](https://linux22.com/image/1345872/%E5%86%85%E6%A0%B8%E8%BF%9B%E7%A8%8B%E5%88%87%E6%8D%A2%E5%88%B0%E7%94%A8%E6%88%B7%E6%A8%A1%E5%BC%8F%E6%97%B6%E6%98%AF%E5%90%A6%E9%9C%80%E8%A6%81%E4%BF%9D%E5%AD%98%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF%EF%BC%9F.png)
据我的教授说,
“从用户模式切换到内核模式时,必须完全保存用户进程的状态。但是从内核模式切换到用户模式时,不需要保存任何内容,因为内核进程没有什么可保存的。”
他说得对吗?内核进程没有什么可保存的吗?
答案1
如果我们剖析你的故事并尝试使用更好的术语,就会更好地理解这一点:
从用户模式切换到内核模式时
这也称为模式切换。
什么时候会发生这种情况?当内核常规被调用;例如,当通过提升或通过硬件中断从用户模式调用它时就会发生这种情况。
什么是这样的常规? 这是一段处理调用/中断的代码。
用户进程的状态必须被完整保存。
确实如此,因为内核将运行一个内核常规我们需要暂时保存正在运行的用户进程的状态。
但是从内核模式切换到用户模式时,不需要保存任何内容
没有什么可以挽救的,因为我们叫了一个常规其中有完毕执行时,内核进程中不再存在状态,因为常规不再运行。
相反,需要再次加载用户进程的状态才能继续执行用户进程。
因此,这里有两件不同的事情:
用户进程,它需要在模式切换时继续执行,因此其状态被存储。
内核例程,它是在模式切换时执行完成的,因此其状态为 已处置 。
至于回答你的问题“内核进程难道没有什么可保存的吗?“;实际上并没有一个内核进程在运行,它只是一个容纳内核内存、例程和一些其他魔法的垫片。
答案2
我从来都不喜欢“内核进程”这个术语,但这只是我个人的问题。我相信答案是,所有进程都是用户进程,只有从用户模式调用内核入口点时才会激活“内核进程”。(我怀疑你的教授可能会说我没有完全正确地表述这一点,但我相信我已经足够接近了,可以让你对这种关系有一个相当准确的想法。)
这就像在普通程序中发生的情况一样:如果您有一个函数hypot
并且它调用sqrt
,则系统必须保存hypot
的局部变量和返回点(从中sqrt
调用的程序计数器/指令指针)。但是当sqrt
返回并hypot
恢复时,sqrt
的堆栈框架可以被丢弃。
答案3
这听起来像是在抢先式多任务处理。
操作系统/内核始终在运行,因此无需保存任何内容。其他程序也在运行(在操作系统之上),但它们每次只占用一小段时间。当每个程序轮到时,需要加载该程序的堆栈以便进行处理,然后需要将所有寄存器的状态从处理器保存回 RAM,以便下一个程序可以加载。
答案4
教授的说法部分正确。
从用户模式切换到内核模式时保存的数据是中央处理器,而不是进程。用户模式和内核模式与 CPU 相关,而不是与进程相关。当内核代表用户执行某些功能时,会预先保存 CPU 的状态。也就是说,CPU 执行用户模式代码时的状态。然后,内核根据用户模式代码的请求执行其操作。最后,内核将 CPU 的状态恢复到先前保存的状态。内核可能会将 CPU 返回到用户模式,具体取决于所讨论的内核。
内核进程无需保存任何内容,因为它之前没有运行。它(内核进程)代替用户模式进程执行一项工作,然后就完成了。就内核而言,CPU 可以返回到用户模式。
操作系统组件通常在内核模式下运行,在 x86 处理器上也称为 Ring 0。用户模式包含应用程序,有时也称为 Ring 3。