学 NJU 操作系统时的一些札记。

第二课。应用视角的 OS

  • 编译器:状态机 .c \to 状态机 .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 的分区格式;
  • gdb 调试工具十分重要,可以帮助我们理解操作系统的底层原理;

    • 当然,如果可以用一些小工具(例如 Makefile),这个过程会舒服更多;
    • wa 命令可以在内存上打一个 watch point,就可以观察到内存的修改;
  • 操作系统本质上就是硬件上运行的 C 程序。

    • 只要实现若干个指令(如 syscall)就可以了(确信;
    • 要学会借助 AI 工具(ChatGPT 以及 Prompt 的艺术),简化学习复杂度;

第四课。Python视角的OS

  • 回顾:硬件/软件的状态机模型

    • OS:包含了若干进程与文件,每个进程都有 API 访问文件;
    • 硬件:执行指令,从 Reset 状态开始就执行 Firmware 代码;
  • C++ 中面向对象的虚函数在 OS 中是如何调用的?

    • 对于每一个类创造一个虚函数表,动态绑定(运行时根据对象类型确定所调用的函数);
  • 操作系统中的程序是状态机,那 OS 本身呢?

    • OS 就是状态机集合的管理者,可以创建/调度状态机!
    • 通过在不同状态机之间随机调度,OS 可以制造一种状态机并行的假象;
    • 状态机是线程或进程的抽象:线程可以共享内存、进程有独立的内存;
    • 调度的难点:封存当前状态机的状态,恢复一个被封存的状态机(分时调用);