困惑:为什么需要 AbstractMachine?
一句话的 take-away message: “计算机系统是一个状态机”。
更具体一点?
理解/构造一个复杂系统 (操作系统/处理器/航母)?
航母不是一天造成的。
采矿船继承了航海时代的设计。
复杂系统的演化通常是 evolutionary 的而不是 revolutionary 的。
无法第一次就设计出 “绝对完美” 的复杂系统
实际情况:从 minimal, simple, and usable 的系统不断经过 local modifications (trial and errors)
Alan Turing's “machine” (1936)
map<int,int> mem
pos
pos++
, pos--
mem[pos] = 0
, mem[pos] = 1
if (mem[pos]) { } else { }
goto label
halt()
ENIAC Simulator by Brian L. Stuart
可以把状态机的形态保存在存储器里,而不要每次重新设置。
计算机的设计受到数字电路实现的制约
存储程序的通用性真正掀起了计算机走向全领域的革命。
CPU cycles 实在太珍贵了
中断 = 硬件驱动的函数调用
if (pending_io && int_enabled) {
interrupt_handler();
pending_io = 0;
}
void foo() { while (1) printf("a"); }
void bar() { while (1) printf("b"); }
能否让 foo()
和 bar()
“同时” 在处理器上执行?
interrupt_handler()
调用void interrupt_handler() {
dump_regs(current->regs);
current = (current->func == foo) ? bar : foo;
restore_regs(current->regs);
}
让 foo()
和 bar()
的执行互相不受影响
foo
访问内存地址 $m$ 时,将被重定位到 $f_\texttt{foo}(m)$bar
访问内存地址 $m$ 时,将被重定位到 $f_\texttt{bar}(m)$foo
和 bar
本身无权管理 $f$gcc a.c
readelf -a a.out
→ 二进制文件的全部信息面对有限的功耗、难以改进的制程、无法提升的频率、应用的需求
如果我们只是为了
任何编程语言编译后都表达了 “内存上的计算”。
一段 C (C++ w/o RTTI, Rust, ...) 程序
main
开始heap
halt
putch
计算机在演化的过程中多了 in 和 out 指令。
我们也配上 read 和 write 不就好了?
一个非常简化的设备模型
相当于在每条指令之后都插入了异常/中断的检查
// after each instruction
if (has_exception) {
exception_handler();
}
if (has_interrupt && int_enabled) {
interrupt_handler();
}
提供
我们的设计做了怎样的取舍?
yzh 觉得……好像只有 OS 不够劲啊
那就让大家好好读读 x86 手册吧……那……
觉得虽然体系里的确什么都有了,但还是不够劲啊,不如玩个大的?
上面跑自己的 OS
上面跑自己编译器编译出来的应用程序
应用程序可以是 NEMU
NEMU 又跑自己的 OS……
好吧我承认这有点炫酷
抽象带来的好处
在抽象层上工作带来的额外好处
本学期 (ICS)
实现 x86/riscv/mips 上的 AbstractMachine API
下学期 (OS)
基于 AbstractMachine 实现多处理器操作系统