按下电源键到操作系统内核运行之间,有一段没有操作系统的"真空期"。接管这段真空期的程序,叫固件(Firmware)。
固件不是一成不变的:它从焊死在 ROM 里的一小块自检代码,演进为今天可以联网更新、运行签名应用、掌管安全信任链的 UEFI。理解这段演进史不是怀旧,而是为了回答三个开发与运维现场高频出现的问题:
这篇文章把固件 50 年的演进拆成三条主线:存储介质怎么变、BIOS 为什么必须死、UEFI 凭什么接班。读完这三问的根因,你自己就能推出来。
一、从 ROM 到 Flash:固件的"身体"变了三次
固件是"活在芯片里的程序",它的能力边界长期由存储介质决定。固件史的前半部,就是存储介质从"不可改写"走向"自由更新"的历史。
1. PROM/EPROM 时代(1970s–1980s):改一个字节,照 20 分钟紫外灯
最早的 PC BIOS 烧录在 PROM(可编程只读存储器)里,出厂即定型。随后的 EPROM 略微松绑——允许紫外线整片擦除。注意是"整片":想改一个字节,也得把芯片拔下来、照 20 分钟紫外灯、再用编程器重写。那个时代的 BIOS 升级等于物理换芯片,普通用户绝无可能。
今天看来这是缺点,在当时却是安全资产:没有任何病毒能改写一块紫外线擦除的芯片。
2. EEPROM / Flash 时代(1990s):CIH 病毒的黑暗注脚
电可擦除 ROM(EEPROM)把"紫外线 + 编程器"简化为"一条写命令",NOR Flash 随即成为 BIOS 的标准载体:按扇区电擦写、随机读取、断电保持。
代价在 1998 年到来——CIH 病毒利用 BIOS 可写的特性直接覆写固件,让主板"变砖"。这是历史上第一次,固件从"最可信的代码"变成了"可被攻击的目标"。此后二十年固件安全的全部课题(Secure Boot、BIOS 刷写风险、固件校验),都是这段历史的续集。
3. SPI Flash 大容量时代(2000s 至今):容量膨胀不是为了自检代码
现代主板的固件普遍存放在一颗 8 引脚的 SPI NOR Flash 芯片里,容量从早期的 512KB 一路膨胀到 16MB、32MB。
膨胀的原因不是自检代码变多了,而是 UEFI 带来的"新住客":
- 图形化设置界面的资源
- Secure Boot 的证书数据库(db / dbx)
- 网卡、RAID 卡的 Option ROM
- 甚至一整个 UEFI Shell
对开发者 / 运维的实际意义
- 刷写失败可恢复。SPI Flash 可以用编程器(CH341A 一类的十几元工具)夹在芯片上离线重写——这是"BIOS 刷坏变砖"的标准救援路径,也是"双 BIOS 芯片"设计(主备两颗,刷坏自动切换)的由来。
- 固件可被恶意持久化。rootkit 写进 SPI Flash 后,重装系统、换硬盘都无法清除。高安全场景要求校验固件哈希,或使用可拔插固件芯片。
- 固件体积验证。下载 BIOS 更新包时核对文件大小、校验哈希,是防刷错包的第一道闸。
二、BIOS 的四宗罪:一个被冻结在 1981 年的契约
BIOS(Basic Input/Output System)随 1981 年 IBM PC 5150 诞生。它给自己定的职责至今写在教科书里:
上电自检(POST)→ 枚举可引导设备 → 加载引导扇区 → 提供一套中断调用,让操作系统不必直接摸硬件。
这四件事在 1981 年都成立。问题在于,它们被"冻结"在了 1981 年的硬件假设上——此后四十年 PC 硬件突飞猛进,BIOS 的契约一字未改。
局限一:16 位实模式与 1MB 内存墙
BIOS 把 CPU 置于实模式(Real Mode):16 位寄存器、无内存保护、任何代码都能访问任何地址。实模式寻址上限 20 位(段地址 × 16 + 偏移),即 1MB 内存空间——其中还要扣掉 640KB 常规内存和各类保留区。
后续的 A20 地址线、保护模式切换都是"打补丁"。BIOS 只能在交出控制权之前替你准备一点扩展内存信息(如 INT 15h 的内存映射查询),真正的模式切换要靠引导程序自己完成——Windows 的 bootmgr、GRUB 的内核加载阶段,都内嵌着一套"从实模式爬进 32/64 位世界"的过渡代码。这层包袱的直接后果是:BIOS 启动的系统,早期初始化代码又长又脆。
局限二:INT 中断调用,一座虚构的硬件层
BIOS 通过中断向量表提供服务:INT 13h 读磁盘、INT 10h 打字符、INT 16h 读键盘。在"每台机器只有一种硬盘"的年代,这是优雅抽象;但当设备形态爆炸(AHCI、NVMe、USB 3.x、Thunderbolt)后,中断接口成了最窄的瓶颈——INT 13h 的语义里甚至没有"设备热插拔"和"64 位 LBA"的位置。
老主板给 NVMe SSD 加"兼容引导"的办法,是让厂商在 Option ROM 里模拟一块 INT 13h 磁盘——打补丁的打补丁。
局限三:以扇区 0 为锚的引导契约
BIOS 的引导契约只有一句话:
读磁盘第一个扇区(512 字节)到内存 0x7C00,若末两字节是 0x55AA,就执行它。
这 512 字节里还要塞进 64 字节的分区表,留给引导代码的只有 446 字节——连"认识文件系统"都做不到,只能级联加载二级引导。MBR 分区表的全部先天缺陷,都源于这个模型。
局限四:没有标准化的运行时环境
BIOS 没有"应用"的概念。想给固件加功能(RAID 驱动、网络启动、诊断界面),各厂商各写各的 Option ROM:无签名、无版本管理、无卸载。安全与管理能力的缺席,最终由 UEFI 统一补齐。
那还要不要学 BIOS?
要。原因有三:
三、UEFI 的崛起:不是"更好的 BIOS",而是重新发明的固件
3.1 从 Intel 私有项目到行业标准
1998 年前后,Intel 为安腾(Itanium)处理器准备固件时发现:让安腾模拟 16 位实模式去跑 BIOS,成本高到荒谬——不如直接设计一套 64 位原生固件。这个项目最初叫 "Intel Boot Initiative",2000 年发布为 EFI 1.0:模块化 C 语言代码、面向对象的协议(Protocol)体系、可运行 EFI 应用、支持 GPT 磁盘。
2005 年,Intel 把规范移交给行业联盟 Unified EFI Forum(成员含 AMD、Apple、AMI、Dell、HP、IBM、Microsoft 等),更名 UEFI。此后按 2.x 线性演进:
|
版本节点 |
关键变化 |
|
2.1 |
引入 Secure Boot 变量框架 |
|
2.3 |
成为 Windows 8 认证强制基线(2011–2012,UEFI 普及的真正分水岭) |
|
2.7 / 2.8 |
补齐 TPM 度量与证书更新机制 |
|
2.8A / 2.9(2020 前后) |
新兴总线与安全机制的持续修订 |
版本号在现场极其实用:主板宣称支持 UEFI 2.3.1 以上,即意味着 Secure Boot、GPT 引导、现代 ACPI 完整可用——这是 Win11 硬件检查在固件侧的依据。
3.2 四个范式转换
① 从汇编遗产到 C 语言模块。 UEFI 以模块(Driver / Application)加载执行,固件开发者面对的是标准化的系统表与协议,而不是寄存器与中断。固件从此可以像软件工程一样做版本管理、单元测试与 OTA 更新。
② 从 16 位实模式到 64 位原生模式。 UEFI 启动时 CPU 已运行在 64 位长模式,引导程序拿到的直接是"满血 CPU"——没有模式切换的过渡代码。Windows 的 winload 在 UEFI 路径上直接省去了一整段历史包袱。
③ 从"读一个扇区"到"执行一个文件"。 UEFI 定义了简单的 FAT 文件系统驱动,引导契约变成:
到 ESP 分区里找 \\EFI\\BOOT\\BOOTX64.EFI(或 NVRAM 指定的 EFI 应用)并执行它。
文件可以命名、可以多版本共存(多引导管理器并存的根基)、可以签名(Secure Boot 的根基)。
④ 从 Option ROM 丛林到驱动模型 + 安全变量。 统一的驱动模型与设备路径协议让第三方硬件以标准驱动接入;固件设置持久化到 NVRAM 变量,启动项成为有名字、有路径、可枚举的数据;Secure Boot 给整个引导链加上密码学信任。
3.3 一张时间线,解决现场一大半争论
给现场工作一个时间锚点:
- 2012 年前的机器 → 大概率 BIOS/MBR
- 2012–2020 年的机器 → 看 CSM 开关
- 2020 年后的机器 → 必然纯 UEFI/GPT
这三句话,能解决现场一大半"引导模式怎么设"的争论。




