Linux 进程切换机制详解
1. 硬件上下文
在多进程环境中,每个进程都有自己的地址空间,但所有进程都需要共享 CPU 寄存器。因此,在恢复一个进程的执行之前,内核必须确保每个寄存器都被加载为该进程暂停时的值。在进程恢复在 CPU 上执行之前,必须加载到寄存器中的一组数据称为硬件上下文。硬件上下文是进程执行上下文的一个子集,进程执行上下文包含了进程执行所需的所有信息。
在 Linux 中,进程的部分硬件上下文存储在进程描述符中,其余部分则保存在内核模式栈中。假设 prev 指向被切换出的进程的描述符, next 指向被切换入的进程的描述符,那么进程切换可以定义为保存 prev 的硬件上下文并将其替换为 next 的硬件上下文的操作。由于进程切换经常发生,因此尽量减少保存和加载硬件上下文所花费的时间非常重要。
早期的 Linux 版本利用 80×86 架构提供的硬件支持,通过远跳转( far jmp )指令切换到下一个进程的任务状态段描述符选择器来执行进程切换。在执行该指令时,CPU 会自动保存旧的硬件上下文并加载新的硬件上下文,从而完成硬件上下文切换。然而,Linux 2.6 采用软件方式执行进程切换,原因如下:
- 通过一系列 mov 指令逐步进行切换,可以更好地控制加载数据的有效性。特别是可以检查 ds 和 es 段寄存器的值,这些值可能被恶意用户伪造。而使用单个远跳转指令时,无法进行此类检查。
- 旧方法和新方法所需
超级会员免费看
订阅专栏 解锁全文
1789

被折叠的 条评论
为什么被折叠?



