上下文切换

上下文切换

2024 南京大学《操作系统:设计与实现》
上下文切换

处理器调度:机制

Context *on_interrupt(Event ev, Context *ctx) {
    current->context = *ctx;

    // Can return any valid Context*
    current = schedule();

    return &current->context;
}

操作系统具有在中断后选择任何进程执行的权利

  • 那到底选哪个比较好……呢?
  • 从批处理操作系统 (1950s) 时代就有的重要问题
    • (因此出现在操作系统书上)
2024 南京大学《操作系统:设计与实现》
上下文切换

xv6 上下文切换的实现

center

  • 进程和操作系统共享两个页面 (trampoline 和 trapframe)
    • 只使用了 “最简” 的 VR 眼镜 (没有 PTE_U)
2024 南京大学《操作系统:设计与实现》
上下文切换

Trampoline (跳板)

一段简短的、用于状态准备的跳转代码

  • call printf@plt
    • call *GOT[printf]
    • 这就是一段 “跳板” 代码
  • xv6
    • 进程的 “VR 眼镜” 完全看不到内核代码
    • 跳板代码实现向内核的跳转
  • 其他应用
    • Just-in-time 编译器
    • 软件热更新
2024 南京大学《操作系统:设计与实现》
上下文切换

进程:Traps

中断/系统调用处理流程

  • uservec (kernel/trampoline.S:21), 映射在 trampoline
  • usertrap (kernel/trap.c:37)
  • usertrapret (kernel/trap.c:90)
  • userret (kernel/trampoline.S:101)

试一试 exec()

  • 配置一个新的 VR 眼镜
  • 准备好 trampoline 和 trapframe
    • kcontext/ucontext
  • 从系统调用返回
2024 南京大学《操作系统:设计与实现》