一、程序
程序就是状态机
程序=计算+syscall
1、状态机和数字电路
数字逻辑电路:数码管
状态=寄存器保存的值
初始状态=RESET
迁移=组合逻辑电路计算寄存器下一个值
2、c程序的状态机模型:汉诺塔
状态=堆+栈
初始状态=main函数第一条语句
迁移=执行一条代码
3、特殊的指令 syscall
调用操作系统syscall,把(M内存,R寄存器)交给系统,任其修改
实现与操作系统的其他对象交互
文件读写/操作系统状态
改变进程状态,创建进程/销毁进程
二、编译器
1、编译器:源代码S(状态机) -> 二进制代码C(状态机)
C=compile(S)
2、编译(优化)正确性:
(1)S与C的可观测行为严格一致
system call;volatile variable loads/stores;terminatiom
(2)Trivially正确(但低效)的实现
解释执行/直接翻译S的语义
3、现代(与未来的)编译优化
在保证观测一致性的前提下改写代码
(1)lnline assembly也可以参与优化
其他优化可能会跨过不带barrier的asm volatile
(2)Event memory consistency(内存一致性)
(3)Call to extern CU = write back visible memory
talk is cheap,show me the code!
三、程序执行
程序 = 状态机 = 计算->syscall->计算->syscall ......
系统通过系统调用(syscall)实现软硬件资源管理
(1)被操作系统加载
通过另外一个进程执行execve设置为初始状态
(2)状态机执行
进程管理:fork、execve、exit,......
文件/设备管理:open,close,read,write,......
存储管理:mmap,brk,......
(3)执行_exit(exit_group)退出