学 NJU 操作系统时的一些札记。
第二课。应用视角的 OS
-
编译器:状态机
.c
状态机.s
;不改变外部観测行为的解释器都是合法的。 -
操作系统中的任何程序都是调用
syscall
的状态机!- 何以验证?使用一个
strace
的调试工具,追踪应用的系统调用。 strace
不关心硬件层面的指令(add, mov 等),而关注 OS 边界的东西
- 何以验证?使用一个
-
例如,当我们尝试
strace -f gcc hello.c
追踪一个 c 程序的编译过程:
execve("/usr/bin/gcc") # 串联所有命令的编译器
execve("/usr/lib/gcc/x86_6h4-linux-gnu/11/cc1") # 进行编译过程
execve("/usr/bin/as",L"as") # 进行汇编过程
execve("/usr/lib/gcc/x86_64-linux-gnu/11/collect2") # 链接预处理
execve("/usr/bin/ld") # 进行链接过程
第三课。硬件视角的 OS
-
CPU 厂商与电脑主板厂商达成的约定:CPU Reset 后的状态(PC 寄存器的值)
-
厂商为操作系统开发者提供了
Firmware
,可以把一个小存储设备的代码加载到内存(如 BIOS)- 例如 intel x86 手册里面,
EIP
的初值是 0000FFF0H; - BIOS 也可以视作一个小“操作系统”,便于厂商配置硬件、加载OS,对应 MBR 的分区格式;
- 如今的 UEFI 规定了硬件所对应的“驱动”规范,便于硬件管理,对应 GPT 的分区格式;
- 例如 intel x86 手册里面,
-
gdb
调试工具十分重要,可以帮助我们理解操作系统的底层原理;- 当然,如果可以用一些小工具(例如
Makefile
),这个过程会舒服更多; wa
命令可以在内存上打一个watch point
,就可以观察到内存的修改;
- 当然,如果可以用一些小工具(例如
-
操作系统本质上就是硬件上运行的 C 程序。
- 只要实现若干个指令(如
syscall
)就可以了(确信; - 要学会借助 AI 工具(
ChatGPT
以及 Prompt 的艺术),简化学习复杂度;
- 只要实现若干个指令(如
第四课。Python视角的OS
-
回顾:硬件/软件的状态机模型
- OS:包含了若干进程与文件,每个进程都有 API 访问文件;
- 硬件:执行指令,从 Reset 状态开始就执行 Firmware 代码;
-
C++ 中面向对象的虚函数在 OS 中是如何调用的?
- 对于每一个类创造一个虚函数表,动态绑定(运行时根据对象类型确定所调用的函数);
-
操作系统中的程序是状态机,那 OS 本身呢?
- OS 就是状态机集合的管理者,可以创建/调度状态机!
- 通过在不同状态机之间随机调度,OS 可以制造一种状态机并行的假象;
- 状态机是线程或进程的抽象:线程可以共享内存、进程有独立的内存;
- 调度的难点:封存当前状态机的状态,恢复一个被封存的状态机(分时调用);