我正在阅读 Robert Love 的“Linux Kernel Development”,他写道系统调用在进程上下文中执行并且能够休眠。当前指针将指向当前任务,即发出系统调用的进程。
我不明白的是如果系统调用可以休眠,执行如何返回到系统调用?如果它在进程上下文中运行,它可以被唤醒并重新调度,但用户进程不能在内核空间中执行。内核是否在调用时创建一个任务/进程来执行系统调用?我知道来自用户空间的系统调用会导致陷阱切换到内核模式并执行相应的系统调用,但在阅读本文之前我假设系统调用无法休眠并被重新安排,但我理解为什么它们应该是能够。
关键部分是这样的:
这是不正确的。当 Robert Love 写系统调用在进程上下文中执行时,基本上意味着进程在内核模式下运行系统调用。当内核处理系统调用时,它仍然在一个进程中运行,即调用进程。如果它决定重新调度,则该进程被挂起,并在任何其他调度的进程中继续执行。
当挂起的进程恢复时,它会在内核模式下继续在系统调用中执行。
2.6 在调度方面的重大变化是,以前只能在用户模式下中断进程;使用可抢占内核,进程也可以在内核模式下被中断(除非它们禁用抢占,这是在内核代码的关键部分完成的)。