1. UEFI起源与背景:从BIOS到UEFI的必然之路

1.1 传统BIOS的局限性——它真的老了

说实话,我在2005年刚入行做固件时,BIOS已经显得力不从心了。你想想看,BIOS的设计理念还停留在1980年代——16位实模式、1MB地址空间、512字节的主引导记录。这些限制在当年是合理的,但到了21世纪,简直是在给硬件工程师上枷锁。

传统BIOS有几个硬伤,我列一下:

  • 16位实模式:只能访问1MB内存,启动时得切来切去,效率极低
  • MBR分区表:最大支持2.2TB磁盘,现在随便一块SSD就超过这个数
  • 中断向量表:硬件资源全靠硬编码,扩展性差到离谱
  • 无标准驱动接口:每个OS都得自己写一套底层驱动,兼容性全靠运气
  • 启动慢:轮询检测硬件,一个一个试,浪费时间

核心痛点:BIOS的16位实模式+1MB地址空间,是它最大的天花板。我在一个老项目中遇到过,为了在BIOS阶段访问4GB内存,不得不反复切保护模式,代码写得跟杂技似的——这根本不是长久之计。

1.2 Intel的安腾困境——压死骆驼的最后一根稻草

说到UEFI的起源,就绕不开Intel的安腾(Itanium)处理器。我记得2001年左右,Intel雄心勃勃地推安腾,想取代x86统治服务器市场。结果呢?BIOS成了绊脚石。

安腾是64位架构,但BIOS只支持16位。Intel发现,要在BIOS上支持安腾,得打无数补丁,改得面目全非。说白了,BIOS的架构根本撑不住64位处理器的启动需求。

Intel当时面临两个选择:

  1. 继续修修补补BIOS,搞出一堆兼容性问题
  2. 推倒重来,设计一个全新的固件接口

他们选了第二条路。这就是Intel Boot Initiative(IBI),后来改名为EFI(Extensible Firmware Interface)。

一个小插曲:我当年读EFI 1.0规范时,觉得这玩意儿太超前了——C语言编程接口、动态协议、GUID表……跟BIOS那套汇编+中断完全是两个世界。但说实话,当时没多少人看好它,都觉得Intel在瞎折腾。

1.3 UEFI论坛的成立——从Intel独舞到行业标准

EFI 1.0在2002年发布,但只有Intel自己在用。其他厂商不买账——凭什么你Intel定标准?

Intel也意识到,固件接口这种基础设施,必须由行业共同维护。于是在2005年,Intel联合微软、AMD、Phoenix、Insyde等公司,成立了UEFI论坛(Unified EFI Forum)。

UEFI论坛的成立,意味着EFI从一个Intel私有项目,变成了开放标准。我参加过几次UEFI论坛的Plugfest,那种感觉就是——大家终于坐下来,认真讨论怎么把启动这件事做好。

时间 事件 说明
2002年 EFI 1.0发布 Intel主导,仅支持安腾
2005年 UEFI论坛成立 Intel、微软、AMD等联合
2006年 UEFI 2.0发布 首个统一规范,支持x86、x64、安腾
2010年后 UEFI逐步取代BIOS Windows 8强制要求UEFI安全启动

1.4 UEFI 2.0规范发布——真正的转折点

2006年,UEFI 2.0规范正式发布。这版规范意义重大——它不再只是Intel的玩具,而是真正面向全行业的固件标准。

UEFI 2.0带来了几个关键特性:

  • 64位运行时:彻底告别16位实模式,支持64位CPU和内存寻址
  • GPT分区表:支持2TB以上磁盘,理论上可达9.4ZB
  • 安全启动(Secure Boot):防止恶意软件在启动阶段注入
  • 网络启动:原生支持PXE,不需要额外ROM
  • 驱动模型:UEFI驱动可以在固件层加载,OS不需要重复开发

注意:UEFI 2.0虽然强大,但兼容性是个大坑。我曾经在一个项目中,UEFI固件启动Windows 7时蓝屏,查了三天才发现是UEFI的某些协议实现不规范。所以,规范是规范,实现是实现——这两者之间往往有差距。

1.5 UEFI vs BIOS:一张图看懂差异

下面这张SVG图,把BIOS和UEFI的核心差异画出来了。我建议你仔细看看,尤其是地址空间和分区表这两列——这是最本质的区别。

BIOS vs UEFI 核心架构对比 传统 BIOS 16位实模式 1MB 地址空间 MBR 分区表(≤2.2TB) 中断向量表驱动 无安全启动机制 UEFI 64位保护/长模式 完整系统内存寻址 GPT 分区表(≤9.4ZB) 协议/驱动模型 Secure Boot 安全启动 UEFI 不是 BIOS 的升级版,而是完全重写的固件接口标准 两者在架构层面没有任何兼容关系

1.6 我的个人体会

做固件这么多年,我最大的感受是:技术债迟早要还。BIOS撑了20多年,最后被安腾逼到墙角,不得不换。UEFI也不是完美的,但它至少解决了BIOS最根本的问题——架构太老。

我记得2012年做第一个UEFI项目时,光是理解Protocol和Handle就花了两周。但一旦上手,你会发现UEFI的设计比BIOS优雅太多了——C语言、模块化、动态绑定,这才是现代固件该有的样子。

给新人的建议:如果你刚开始学UEFI,别急着看代码。先把UEFI 2.0规范的前三章读透——那里定义了UEFI的核心概念:System Table、Boot Services、Runtime Services、Protocols。这些基础打牢了,后面学什么都快。