21. 系统调用、中断和上下文切换

背景回顾:回顾我们 “操作系统 = 对象 + API” 视角上构建的应用生态:操作系统上的可执行文件和库函数仅仅通过 “计算” 和系统调用 API,就构建出了完整的操作系统世界。现在是时候近距离穿越这个边界,近距离观察操作系统内核了。

本讲内容:实现操作系统内核的基础机制;50 行实现操作系统内核。

21.1 syscall 指令

21.2 中断机制和上下文切换

Take-away Messages

系统调用指令是一种特殊的 “长跳转”——而跳转的目标是由操作系统配置好、应用程序不能决定的。类似地,处理器中断也会被动调用长跳转到操作系统内核。操作系统内核代码会 “封存” 进程的状态机:

  1. 对于内存中的页面,保持原封不动;
  2. 使用精心构造的代码,小心地将所有寄存器保存到内存中。

此时,计算机系统就处于所有程序都被封存、操作系统代码正在执行的状态。操作系统会选择性地调度下一个寄存器现场到 CPU 上,实现上下文切换。

课后习题/编程作业

1. 阅读材料

📚阅读材料

教科书 Operating Systems: Three Easy Pieces

  • 第 6 章 - Direct Execution
🖥️编程

本次课程的示例代码中包含一些非常重要的调试技巧,例如 hook 每一次 gdb stop,在停止时便利寄存器的数值,并且打印出 “变化” 的寄存器。这些看似不起眼的技巧,可以大幅提升你的调试效率,务必在实践中体会和掌握:你需要这些技巧来完成操作系统内核相关的实验。