操作系统上的最小程序

操作系统上的最小程序

2025 南京大学《操作系统原理》
操作系统上的最小程序

什么是程序?(编译后)

答案在 NEMU 里:

struct CPUState {
    uint32_t regs[32], csrs[CSR_COUNT];
    uint8_t *mem;
    uint32_t mem_offset, mem_size;
};

处理器:无情的、执行指令的状态机

  • M[PC]M[PC] 取出一条指令
  • 执行它
  • 循环往复
2025 南京大学《操作系统原理》
操作系统上的最小程序

可以从一开始就获得机器的控制权吗?

构造一个 “最小” 的程序

  • 从一开始就取得程序的控制权
  • 《计算机系统基础》说,程序是从 _start 开始执行的
void _start() {
    // ...
}

让 AI 帮你夺取控制权

  • 我定义了 _start,如何编译程序,直接从 _start 执行?
  • 但这个程序会 Segmentation Fault,为什么?
    • (当然,我们要调试它)
2025 南京大学《操作系统原理》
操作系统上的最小程序

退出程序

程序自己是不能 “停下来” 的

  • 指令集里没有一条关闭计算机的指令,那么操作系统是如何在关闭所有软件后,切断计算机的电源的?

只能借助操作系统

movq $SYS_exit,  %rax   # exit(
movq $1,         %rdi   #   status=1
syscall                 # );
  • 把 “系统调用” 的参数放到寄存器中
  • 执行 syscall,操作系统接管程序
    • 操作系统可以任意改变程序状态 (甚至终止程序)
2025 南京大学《操作系统原理》
操作系统上的最小程序

(二进制) 程序 = 状态机

状态

  • gdb 内可见的内存和寄存器

初始状态

  • 由 ABI 规定 (例如有一个合法的 %rsp)

状态迁移

  • 执行一条指令
    • 我们花了一整个《计算机系统基础》解释这件事
    • gdb 可以单步观察状态机的执行
  • syscall 指令: 将状态机 “完全交给” 操作系统 (上帝 & 祈祷)
2025 南京大学《操作系统原理》