1 计算机系统的状态机模型

1.1 一切皆为状态机

  • C 代码 = 状态机
    • SimpleC & GDB (TUI source)
  • 汇编代码 = 状态机
    • GDB (TUI assembly)
  • 处理器 = 状态机
    • mini-rv32ima; ICS PA
  • 数字电路 = 状态机
    • Logisim

1.2 计算机系统的状态机模型

  • 状态
    • 内存、寄存器的数值
  • 初始状态
    • 由系统设计者规定 (CPU Reset)
  • 状态迁移
    • 从 PC 取指令执行

基本准确;但我们可以做一些补充

1.2.1 计算机系统:状态

  • 寄存器、内存
1
2
3
4
5
struct CPUState {
uint32_t regs[32], csrs[CSR_COUNT];
uint8_t *mem;
uint32_t mem_offset, mem_size;
};
  • 还有外部世界的态
  • 设备上的寄存器 (memory-mapped I/O 可以访问)
  • Interrupt/Reset Line
  • 客观存在,但计算机系统不能直接访问
    • 类比:进程只能通过 syscall 访问进程外的信息

1.2.2 计算机系统:初始状态

CPU Reset

  • Intel 的工程师已经规定好,x86 处理器复位:
    • EIP = 0x0000fff0
    • CR0 = 0x60000010
      • 处理器处于 16-bit 模式
  • RISC-V:百花齐放,百家争鸣
    • 初始 PC 无规定;寄存器除了 x0 全部 undefined
    • 少数 CSR 有规定 (例如 interrupt disabled)
      • 设计原则:省电路
      • 软件能做的,硬件绝对不管

1.2.3 计算机系统:状态迁移

执行指令

  • 如果有多个处理器?
    • 可以想象成 “每次选一个处理器执行一条指令”

响应中断

  • if (intr) goto vec;

输入输出

  • 与 “计算机系统外” 交换数据
  • 类似于程序:不使用 syscall 就等于死循环

2 固件:接管计算机系统的第一个程序

2.1 计算机系统 = 状态机

程序员如何控制计算机系统?

  • 仅有 RESET 状态是不够的
  • 答案:计算机系统会和 System Programmers 达成约定

2.2 Firmware

“固件”

  • 厂商 “固定” 在计算机系统里的代码
    • 早期:固件是 ROM
    • 想升级?换芯片!

Firmware 的功能

  • 运行程序前的计算机系统配置
    • CPU 电压、内存时序、接口开关……
    • (这些配置要生效可能需要重启计算机)
  • 不严格地说,加载操作系统
    • QEMU:可以绕过 Firmware 直接加载操作系统 (RTFM)

Firmware:配置计算机系统
bios-1

Firmware:加载存储设备上的引导程序
bios-2

Firmware:就是一段代码

  • 一个小 “操作系统”
    • CPU Reset 后初始化硬件;对接操作系统 Boot Loader
  • Legacy BIOS (Basic I/O System)
    • IBM PC 所有设备/BIOS 中断是有 specification 的
      • 16-bit DOS 时代 BIOS 常驻内存,提供 I/O 等功能
    • 成就了百花齐放的 “兼容机” 时代
      • AMI 和 Phoenix BIOS, 等都活到了今天!
  • UEFI (Unified Extensible Firmware Interface)
    • 提供更丰富的支持 (例如设备驱动程序):指纹锁、山寨网卡上的 PXE 网络启动、USB 蓝牙转接器连接的蓝牙键盘……

计算机系统是严格的数学对象:没有魔法;计算机系统的一切行为都是可观测、可理解的。

  • 处理器是无情的执行指令的机器。
  • 处理器会规定好 Reset 后的行为。
  • Reset 后 Firmware 开始运行,再加载操作系统。
  • 厂商逐渐形成了达成共识的 Firmware Specification (IBM PC “兼容机”、UEFI、……)。