1.什么是操作系统?
1.什么是操作系统?
对单一计算机硬件系统做出抽象、支撑程序执行的软件系统。通过“虚拟化”硬件资源为程序运行提供服务的软件。
操作系统可以访问任何硬件资源。
2.什么是程序?
程序就是一个状态机。
程序=计算+syscall
状态机视角的程序:
程序=计算->syscall->计算->...
编译正确:
编译正确就是指,现在有一个C代码状态机,一个汇编状态机,其中C代码状态机上有一些部分不可优化,不可优化就是指假设x是不可优化的一个变量,在C语言的状态机上我要读x,读一次就是读一次,读两次就是读两次,读一万次就是读一万次,不能优化它。 C代码定义了一个C代码的状态机,汇编代码也定义了一个状态机,正确的编译就是在C代码状态机上所有不可优化的部分都被正确的翻译到汇编代码状态机上。
3.操作系统中的一般程序
C语言和汇编语言其实本质上没有区别,区别只在编译器,它们只是同一个世界中的两个不同维度中的东西。
通过操作系统调用访问操作系统。
所有程序都是 计算→syscall→...这种状态机的运行
程序是个状态机
本质上,所有的程序和Hello World类似
- 被操作系统加载
通过另一个进程执行execve设置为初始状态
- 状态机执行
进程管理:fork, execve, exit. ...
文件/设备管理: open, close,read,vrite,......
存储管理:mmap, brk,...
- 直到_exit (exit_group)退出
总结:
1.程序=状态机
2.在源代码S视角:状态迁移=执行语句
3.在二进制代码C视角:状态迁移=执行指令
在源代码和二进制代码之间有一个东西是编译器
编译器C=compile(S)
应用视角的操作系统:就是一条syscall指令