从固件到操作系统

从固件到操作系统

2025 南京大学《操作系统原理》
从固件到操作系统

回到 40 年前

IBM PC/PC-DOS 2.0 (1983)

  • Firmware (BIOS) 会加载磁盘的前 512 字节到 0x7c00
    • (如果这 512 字节最后是 0x55, 0xAA)
    • 为什么是 0b01010101 和 0b10101010?

让我们试一试

  • 我们喜欢 shell 的原因:Quck & Dirty
  • (printf "\xeb\xfe"; cat /dev/zero | head -c 508; printf "\x55\xaa") > a.img
    • eb fe 是 jmp .
2025 南京大学《操作系统原理》
从固件到操作系统

如果 Firmware 也是代码?

计算机系统从 CPU Reset 开始

  • CPU Reset 的时候,0x7c00 应该是啥也没有的
  • Firmware 的代码扫描了磁盘、加载了它

那我们是不是可以看到 “加载” 的过程?

2025 南京大学《操作系统原理》
从固件到操作系统

Firmware 和系统程序员的第一个接口

我们可以写 446 字节的 16-bit 代码

  • 446 = 512 - 2 (55 aa) - 64 (分区表)

Grub 的例子

  • Stage 1: 扫描磁盘,找到附近的 ELF 文件头,加载到内存
    • 根据文件系统,可能会需要 Stage 1.5
  • Stage 2: 这个 ELF 文件是 Grub; 弹出熟悉的选择系统窗口
  • Stage 3: 加载 Linux Kernel
    • 忽然觉得没什么难的了!
2025 南京大学《操作系统原理》
从固件到操作系统

RISC-V: 固件与操作系统引导

只需要提问 & 追问就行了

  1. RISC-V 系统是如何复位、执行什么固件、如何加载操作系统的?
  2. OpenSBI 的入口位于什么地方?
  3. _start 开始的 _try_lottery 是做什么的?
    _start:
      /* Find preferred boot HART id */
      MOV_3R	s0, a0, s1, a1, s2, a2
      call	fw_boot_hart
      add	a6, a0, zero
      MOV_3R	a0, s0, a1, s1, a2, s2
      li	a7, -1
      beq	a6, a7, _try_lottery
      /* Jump to relocation wait loop if we are not boot hart */
      bne	a0, a6, _wait_for_boot_hart
    
2025 南京大学《操作系统原理》
从固件到操作系统

编译 OpenSBI

感到困难?

  • 《操作系统》课要求我们编译 OpenSBI,并理解固件是如何被编译链接的。但我是新手,毫无头绪,应该怎么办?

“Everything is a State Machine”

  • Makefile 也是程序;它也是状态机
  • 程序不好读的话,我们还可以调试它!
    • 计算机系统公理:你想到的就一定有人做到
    • “总有人会去发明轮子的”
2025 南京大学《操作系统原理》
从固件到操作系统

“调试” Makefile

观察状态机执行

  • 《计算机系统基础》课的例子
make -nB \
  | grep -ve '^\(\#\|echo\|mkdir\|make\)' \
  | sed "s#$AM_HOME#\$AM_HOME#g" \
  | sed "s#$PWD#.#g" \
  | vim -

Command line tricks

  • make -nB
    • 适当 prompt,AI 能给出这个思路 (AI 的直觉真的很好)
  • grep 过滤干扰项;sed 让输出更易读
2025 南京大学《操作系统原理》
从固件到操作系统

“调试” Makefile (cont'd)

曾经

  • :%s/ /\r /g
    • 使得每个命令就像 “一句话”
    • 自力更生

现在

  • 让 AI 解释一下这个命令做了什么吧
    • 给听到最后的同学一个彩蛋
      • 我的 ag 可不只是 ChatBot
      • 我的背后是 UNIX Philosophy!
    • (感觉一切努力都白费了 😂 也许可以退休 🎣 了?)
2025 南京大学《操作系统原理》
从固件到操作系统

智能 Agent 来啦

$ npm install -g @anthropic-ai/claude-code

center

(其实之前就有 GitHub Copilot CLI 了)
  • “How does the payment processing system work?”——同理,可以 “帮我整理 OpenSBI 的编译流程”
  • “Fix the type errors in the auth module.”
2025 南京大学《操作系统原理》