背景

程序 = 状态机

  • (单线程程序) Tower of Hanoi
  • (多线程程序) Peterson 算法
  • (计算机系统) 调试 Firmware 和操作系统内核

本次课内容与目标

学会更有效地使用 “程序 = 状态机” 这个理解

  • 年轻人的第一个 model checker

学习 “程序 = 状态机” 在计算机科学中的应用

  • 哲 ♂ 学和科学探讨
  • 各种黑科技…

状态机模型:复习

上节课的两个例子

Tower of Hanoi (hanoi.c)

  • C 语言的执行模型 → 假象的执行
  • C 语言编译成汇编代码 → 在机器 (或模拟器) 上执行

Peterson 算法

Peterson 算法:正确性

Safety: 坏事永远不会发生

  • 在任意执行中,$\textrm{PC}_1 = 4 \land \textrm{PC}_2 = 4$ 不会出现
    • 图论的语言:$\textrm{PC}_1 = 4 \land \textrm{PC}_2 = 4$ 的节点在 $G$ 上不可达

Liveness: 好事总会发生

  • 在任意执行中,有限步之内 $\textrm{PC}_1 = 4 \lor \textrm{PC}_2 = 4$ 会出现
    • 图论的语言:不存在 $G$ 的一条 (无穷) 路径,每个线程都执行了无穷多步,且所有经过的节点 $\textrm{PC}_1 \ne 4 \land \textrm{PC}_2 \ne 4$

Fairness: ...


Wow!

  • 这就是 model checking!

状态机模型:应用 (1)

程序 = 状态机

Quite trivial

  • 我们在《数字逻辑电路》上第一次学
  • 在《计算机系统基础》又学了一遍
  • 《操作系统》上怎么又要学一遍?

“程序 = 状态机 = 有向图” 是计算机科学最的基础工具之一。

哲 ♂ 学探讨

我们的物理世界是 deterministic 的状态机吗?

  • 宏观物理世界近似于 deterministic 的状态机 (经典力学)
  • 微观世界可能是 non-deterministic 的 (量子力学)

把物理世界建模成基本粒子的运动

哲 ♂ 学探讨 (cont'd)

可以在这个模型上严肃地定义很多概念:预测未来、时间旅行……

  • 成为你理解物理 (和计算机) 世界的参考

例子

  • Cellular automata 不支持 “时间穿越”
    • 怎么添加一个公理使它可以支持?
  • Cellular automata 不支持 “预测外来”
    • 能否添加一个 syscall 使它支持?
  • ……

状态机模型:理解现代 CPU

计算机硬件的 Simple Sequential Execution (SSE)

  • $(M_0, R_0) \to (M_1, R_1) \to (M_2, R_2)$
  • 能否直接 $(M_0, R_0) \to (M_2, R_2)$?

# printf("%d + %d = %d\n", a, b, a + b);
lea    (%rdi,%rsi,1),%ecx
mov    %esi,%edx
xor    %eax,%eax
mov    %edi,%esi
lea    0xe70(%rip),%rdi  # stdout
jmpq   1050 <printf@plt>

超标量 (superscalar) 处理器

  • 允许在状态机上 “跳跃”

状态机模型:应用 (2)

Hacking Programs

程序执行 = 状态机执行

  • 我们能不能 “hack” 进这个状态机
    • 观察状态机的执行
      • gdb
    • 甚至改变状态机的执行
      • ???

应用 (1): Time-Travel Debugging

程序执行是随时间 “前进” 的 $ s_0 \to s_1 \to s_2 \to \ldots $

  • 能否在时间上 “后退”? (time-travel)
    • 经常 gdb 不小心 step 过了,从头再来……
    • 记录所有的 $s_i$,就能实现任意的 time-traveling

记录所有 $s_i$ 的开销太大 ($s_i$ 由内存 + 寄存器组成)

  • 一条指令的 side-effect 通常有限
    • 只记录初始状态,和每条指令前后状态的 diff
    • $s_0, \Delta_{(s_0, s_1)}, \Delta_{(s_1, s_2)}, \ldots $
    • 正向执行:$s_{i+1} = s_i \odot \Delta_{(s_i, s_{i+1})}$
    • 反向执行:$s_{i-1} = s_i \odot \Delta_{(s_{i-1}, s_i)}^{-1}$

应用 (1): Time-Travel Debugging (cont'd)

gdb 的隐藏功能 (大家读过 gdb 的手册了吗?)

  • record full - 开始记录
  • record stop - 结束记录
  • reverse-step/reverse-stepi - “时间旅行调试”

例子:调试 rdrand.c

  • Reverse execution 不是万能的
    • 有些复杂的指令 (syscall) 无法保证

应用 (2): Record & Replay

在程序执行时记录信息,结束后重现程序的行为

  • 确定的程序不需要任何记录
    • 假设 $s_0$ 执行 1,000,000 条确定的指令后得到 $s'$
      • 那么只要记录 $s_0$ 和 1,000,000
      • 就能通过 “再执行一次” 推导出 $s'$

应用 (2): Record & Replay (cont'd)

Record & Replay: 只需记录 non-deterministic 的指令的效果

  • (单线程) 应用程序
    • syscall, rdrand, rdtsc, ...
    • rr (Mozilla)
      • CACM Staff. To catch a failure: The record-and-replay approach to debugging. Communications of the ACM, 63(8), 2020.
  • (单处理器) 操作系统
    • mmio, in, out, rdrand, rdtsc, 中断, ...
    • QEMU (-icount shift=auto,rr=record,rrfile=replay.bin)
      • G. Dunlap, et al. ReVirt: Enabling intrusion analysis through virtual-machine logging and replay. In Proc. of OSDI, 2002.

应用 (3): 全自动测试

void f(int x, int y) {
  int z = x * y;
  if (z == 18) {
    bug();
  }
}

int main() {
  int x = nondet(), y = x * 2;
  f(x, y);
}

执行一次程序,可以得到一条路径

  • 如果我想换一条路径呢?
    • C. Cadar, D. Dunbar, D. Engler. KLEE: Unassisted and automatic generation of high-coverage tests for complex systems programs. In Proc. of OSDI, 2008.

总结

总结

本次课内容与目标

  • 学会更有效地使用 “程序 = 状态机” 这个理解
    • 年轻人的第一个 model checker
  • 学习 “程序 = 状态机” 在计算机科学中的应用
    • 哲学、理论计算机科学和黑科技

Take-away messages

  • 敢于去想
  • 计算机系统公理:你想到的就一定有人做到
    • 你也能做到