中断处理程序的秘密

参数和返回值 “Context”

Context *handler(Event ev, Context *ctx) {
  ...
}
  • 中断发生后,不能执行 “任何代码”
    • movl $1, %rax 先前状态机就被永久 “破坏” 了
    • 除非把中断瞬间的处理器状态保存下来
    • 中断返回时需要把寄存器恢复到处理器上
  • 看看 Context 里有什么吧

上下文切换

状态机在执行……

  • 发生了中断
    • 操作系统代码开始执行
    • 状态机被 “封存”
    • 我们可以用代码 “切换” 到另一个状态机
  • 中断返回另一个状态机的状态
    • “封存” 的状态还在
    • 下次可以被恢复到处理器上执行

实现多处理器多线程

AbstractMachine API

  • 你只需要提供一个栈,就可以创建一个可运行的 context
Context *on_interrupt(Event ev, Context *ctx) {
  if (!current) {
    current = &tasks[0];  // First trap for this CPU
  } else {
    current->context = ctx; // Keep the stack-saved context
  }

  // Schedule
  do {
    current = current->next;
  } while (!on_this_cpu(current));

  return current->context;
}