UEFI背后的历史

UEFI背后的历史

从首次运用于Intel 安腾处理器,到第一版统一的可扩展固件接口(UEFI)规范出版,无论是在高性能服务器,移动设备或是深度嵌入式设备等,UEFI已在所有平台完全淘汰了BIOS。UEFI的成功离不开行业支持的开源实现以及行业指导平台固件规范。UEFI因其开放标准的特性,确保了它可以获得来自整个行业的广泛支持和投资的同时也推进了整个行业的技术变革。


UEFI大事年表

90年代初:传统BIOS的天下。计算机系统的创新严重受限。

1997年:英特尔开始为安腾电脑设计BIOS。

1999年:EFI 1.0 推出。

2000年:EFI 1.02发布。

2002年:EFI 1.10发布。

2005年:UEFI论坛成立。

2006年:UEFI 2.0发布。

2007年:UEFI 2.1

2008年:UEFI 2.2

缘起

UEFI发明有其偶然性,也有必然性。在1990年代后期,传统BIOS已经严重制约了计算机的创新。

在UEFI被发明之前,PC机都在用传承自1979年的传统BIOS。初代BIOS由几个IBM工程师开发,他们从没有想到自己写的汇编程序会用这么久。我有幸遇到过其中之一,一个满头银发的慈祥老头,当时他还在IBM工作,他对传统BIOS能工作那么久也深感惊讶,当然还有荣幸。传统BIOS在发明后虽经过修修补补,但本质没有丝毫变化:一堆用汇编写的硬件初始化代码,It works,但它封闭、神秘和充满各种不清不楚的预设和祖传代码。

在1997年,当时的 Intel员工们正致力于如何支持基于安腾处理器芯片组的服务器。尽管设备中的一些部件是全新的:处理器,芯片组,电路板设计设计,操作系统等等,但是初期的计划还是使用传统的BIOS代码来完成此项工作。这样可以至少保证一个东西不变,BIOS。计划进行得并不顺利,最终该计划被证实并不可行。由此也就遗留下一个问题:该如何在这些平台上引导操作系统,留给Intel交出解决方案的时间已不足一年。

这一挑战催生了所谓的英特尔引导计划(IBI),目标定位于开发一套支持安腾处理器的引导规范。项目组考虑了现实的可选方案:“创造”还是“购买”,其中包括采用IEEE开放固件标准,使用ARC平台标准,或是从无到有构思一套全新的解决方案。开放固件标准虽然提供了一种不错的技术手段,但在可用时间内在业务基础设施部署方面有所不足,而ARC平台标准因其在平台设计上太过受限也不得不放弃。类似的,其他的“购买”选项亦不能在可用时间内给出完善的解决方案。因此Intel内部决定开发一套全新的机制。

考虑到底层编程的复杂性以及希望操作系统尽可能少地去了解平台的硬件细节,在平台固件和OS加载器间使用高级C语言接口看起来成为一个必然选择。有了这个绝佳的想法,为启动过程定义一个在固件和操作系统间CPU架构无关的API 只是剩下最后的一跃而已。

诞生

由于历史原因,操作系统对于硬件平台和系统BIOS有许多隐含的依赖关系。这些不为人知的因素阻碍了变革,使创新棘手且相对昂贵。定义这样的API并使它可以适用于普通的计算机能带来极大的价值。很显然,这样一种可以减少平台和操作系统相互隐含依赖的全新技术,将有可能解耦平台和操作系统的创新速率。

这样一系列认知导致第一次固件接口数量的大规模增长。通过采用CPU-ISA中性的方式,程序的适用范围可以扩大到更多的英特尔处理器家族。甚至从20世纪90年代后期开始,IA32计算机上使用的常规BIOS就已明显成为创新的拖累。新型固件接口的设计者们因而也开始尝试用新技术引导IA32处理器。在大约1999年的这段时间,IBI计划制定了新接口的首版规范。开发者们将新规范命名为EFI(Extensible Firmware Interface):对任何特定类型的电脑保持中立性,仅意图描述接口。同时呼吁使之成为未来成长的基准。

EFI被第一代基于安腾处理器的计算机所采用,并从此作为其引导程序。英特尔于2000年12月发布了EFI规范1.02的初始版本,涵盖将控制权从平台固件转交给操作系统所需的操作范围。从一开始,英特尔就为的采用设立了很低的门槛,同时发布了几乎没有任何许可限制和免版税的示例实现代码。直到今天,低门槛的原则仍然是其核心理念。

在早期版本的基础上,2002年末发布了EFI规范1.10。这次更新主要在规范中添加了一个固件驱动模型,该模型解决了在引导过程中使用扩展卡设备的问题。本质上,这提供了一种替代最先应用在ISA总线设备上的脆弱的16位可选ROM的可行性,并很快也用于PCI引导设备。


UEFI的到来

BIOS供应商,OS供应商,系统制造商和芯片生产商联合起来,UEFI论坛诞生了。

在2005年初,EFI在IA32上推广有所起步,但还不尽如人意。但是趋势明显在告诉人们:常规BIOS技术终将被彻底淘汰。鉴于固件是IA32平台的关键一环这样一个不容忽视的事实,在2005年年中时候,包括BIOS供应商,OS供应商,系统制造商以及芯片生产公司在内的行业参与者统一建立了统一的EFI论坛(UEFI,Unified Extensible Firmware Interface)并长期共同管理这项技术。

Intel贡献了EFI规范作为新论坛的开端,创始成员们以真正统一的方式工作,制定了获得广泛的行业支持和认可的新规范。这份由论坛制定的首版规范——UEFI规范2.0,于2006年一月发行。

在设计固件与操作系统间接口的同时,论坛同意为固件内部构造符合UEFI规范的标准化接口。这项工作产生了PI规范(Platform Initialization)。规范1.0于2016年10月发布。这份规范旨在使芯片驱动程序可以在各种固件厂商开发的平台上直接运行而无需修改,从而简化和缩短新产品的部署。

论坛继续就UEFI规范(2007年1月发布2.1版本)的更新达成共识。除此之外,这种基础设施的引入使得固件的用户界面更加图形化,本地化。

2008年9月推出的2.2版本加入了对IPv6的支持,同时改进了平台安全策略。2.2版本曾在很短的段时间内是最大/最完善的版本,很大一部分原因在于实施在规范之后。最新的规范是UEFI 2.5和PI 1.4。

开源的步伐

Intel提供了首版EFI规范的最初的开源示例实现。随着EFI规范演变成UEFI规范并且还实现了PI规范。随着UEFI和PI规范的更新,这项工作还在进行中。项目最早落户于Welcome。在开源大潮的带领下,先扎根于SourceForge,在Github火遍全球的情况下,也移步于Github。大家有兴趣可以在tianocore · GitHub下找到它的身影。

结语

如今,从智能手机到打印机,笔记本电脑,服务器,甚至超级计算,UEFI技术被已经广泛使用。有前瞻性的新设备和平台技术将通过采用UEFI缩短上市时间从而更容易实现受益。

值得一提的是UEFI内核的大部分代码是由Intel的中国工程师开发的。在大家一次次电脑的正常运行后面,有他们辛勤工作背影。他们也为固件的开源和国产化做出了自己的贡献。

后记

如果大家希望深入了解UEFI,这里有几个问题大家可以深入思考一下:

1. 为什么UEFI采用PE/COFF格式作为UEFI驱动和应用的标准,而不是ELF格式?

2. 绝大多数UEFI核心代码都是C语言写的,为什么不用C++,可以不可以用C++?热门的OO和他有什么关系?

3. UEFI和其他的uboot, coreboot等各自的优点和关系如何?

4. UEFI为什么选择FAT作为UEFI分区标准?

UEFI历史和架构其他文章:

UEFI和UEFI论坛 - 知乎专栏

UEFI背后的历史 - 知乎专栏

ACPI与UEFI - 知乎专栏

UEFI安全启动 - 知乎专栏

UEFI与硬件初始化 - 知乎专栏

UEFI架构 - 知乎专栏

欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!

用微信扫描二维码加入UEFIBlog公众号

编辑于 2018-09-27

文章被以下专栏收录