Extensible Firmware Interface
如果你并非一位专业技术人员,要独立完成主板BIOS的详细设定是一个非常困难的任务。事实上,绝大多数用户都对BIOS望而生畏,复杂的设定项 目、不友好的字符界面以及密密麻麻的硬件参数,令人不知从何下手。而且设定BIOS还会有一定的危险性,倘若你把CPU或内存的频率设得过高,系统就很可 能无法开机。这些情况对专业人士而言根本不是什么问题,但多数PC用户并不掌握相关的专业知识,调校BIOS对他们来说的确太困难了。BIOS的功能仅限 于对计算机硬件的基础设定,而无法提供诸如系统恢复、远程管理、磁盘修复工具之类的附加功能。以英特尔为首的PC业界很早就意识到BIOS存在的弊端,在 英特尔的主导下,名为“EFI(Extensible Firmware Interface,可扩展固件接口)”的下一代BIOS技术早在1999年底就开始启动,EFI以人性化的图形界面代替文本界面,对硬件的管理也更加科 学,同时拥有灵活的可扩展性,允许设备厂商增加各类附加功能,大大提高了整机的可管理性。2004年,EFI开发成功,不过英特尔初期只是将EFI用于 Itanium服务器平台。PC厂商、主板厂商和BIOS开发商虽然对EFI很感兴趣,但受限于Windows操作系统,EFI一直都无法进入PC产品 中,导致其一度沉寂。最终扮演领衔者角色的却是苹果公司,苹果在1月份推出Macbook pro率先采用EFI技术。PC方面,微软Windows Vista的未来版本也将对EFI提供支持,EFI有望在未来三年内取代BIOS成为主导性的固件接口。
EFI开发的必要性
BIOS是操作系统与底层硬件的衔接桥梁,它的全称是“Basic Input Output
System(基本输入输出系统)”,BIOS的主要功能是开机时管理各个硬件系统,并为后续操作系统的引导提供必要的信息。简单点说,当用户按下电源按
钮,计算机“滴”的一声启动时,BIOS就开始处于工作状态。如果是初次开机,用户需要进入BIOS对硬件进行设定,例如CPU的工作频率、前端总线频
率,内存的速度、延时,各个设备的启动顺序等等,保存退出之后,BIOS就会严格依照这些设定进入下一步的运行。BIOS将各硬件的具体参数传送给指定硬
件的Firmware(固件),这些硬件便会严格依照这些性能参数工作。如果这一步没有问题,那么BIOS就会发出读取硬盘、启动操作系统的命令,接下来
操作系统的核心数据便会被载入到内存,这项工作要花费不短的一段时间,此时我们在屏幕上看到的就是系统启动的进度条。当操作系统开始启动后,BIOS就自
动释放,系统的管理权转交给操作系统,此后BIOS的职能就转为软件与硬件的衔接桥梁,任何与硬件操作相关的软件指令都必须依赖BIOS方可完成。
BIOS在设计时并没有预备任何安全措施,如果我们把CPU或内存的性能参数调得太高,达到远超出CPU和内存硬件所能承受的限度,系统仍然会要求CPU 和内存工作在这个速度上,出现的后果就是计算机无法开机或者死机。一旦遇到这类情况,用户可以利用主板BIOS的跳线将这些设定清空,使之恢复到默认的状 态,但这项工作非常繁琐且要求用户有一定的经验,普通用户很难完成。由于BIOS一直都缺乏预防此类危机的手段,一些主板厂商被迫自行发展自动恢复技术, 如果BIOS参数设定不当导致无法开机,系统会在十几秒后自动重启,并将BIOS恢复回默认状态。
尽管BIOS很好地满足了计算机的基本需求,但在今天它已经相当落伍了。作为DOS时代的产物,BIOS并没有为未来PC的发展做好准备,所有的BIOS 都工作在16位的“实模式(Real Mode)”状态下,而实模式是英特尔公司在1978年8086 PC平台的产物。即便你拥有一部64位双核心的顶极PC,在开机时系统都只能工作在16位模式下,可管理到的最大内存为1MB,而系统启动时各类扩展卡以 及整合设备(如网络控制器、音频控制器)都必须被BIOS访问,但它们的ROM(Read Only Memory)容量也都被限制在128KB。显然,如此寒酸的硬件支持让BIOS除了老老实实为启动操作系统作准备外什么都干不了。
采用汇编语言编写是BIOS的另一个缺陷。作为低级语言,汇编语言具有与底层硬件紧密结合、程序速度快以及代码简练的优势。在PC刚刚开始出现的上个世纪 八十年代,汇编语言可以说是编写BIOS程序的最佳选择。但事过境迁,为BIOS增加新功能是业界的共识,但BIOS所采用的汇编语言相当复杂,程序编写 的难度极大,如果要增加新功能,用汇编语言来编写简直就是一个灾难。再者,新功能的引入会让BIOS汇编程序变得很复杂,调试成为一个难题,将出现Bug 频频的糟糕情况。如果你对主板BIOS升级有所了解,一定会明白我们所指的是什么意思。BIOS通常都有这样那样的毛病,主板厂商通过更新BIOS程序版 本来解决问题,但这个新BIOS可能又带来了新的Bug。显然,如果作为下一代BIOS技术的EFI要彻底克服这个缺陷,就必须采用功能更强大且易于调试 的高级语言来编写。
(1)模块化设计与兼容特性
英特尔早在1999年就发布首个EFI技术规范,该版本只用于安腾服务器平台,不过很快英特尔就拿出适用于X86 PC和Xscale嵌入系统的EFI版本,这样英特尔所有计算平台的固件接口就能够完全实现从BIOS到EFI的转换。
图1 EFI系统的逻辑模型。协议架构(Protocol architecture)提供硬件无关的通讯渠道,平台驱动和框架驱动为EFI运行建立基础,兼容支持模块则保证非EFI硬件也能够在EFI平台中兼容使用。
采用模块化设计是EFI与传统BIOS在逻辑结构上最大的不同点之一。如图1,位于底部的是硬件层,与硬件层直接交互的就是EFI的驱动执行环境 (Driver Execution Environment),它包括协议架构(Procotol architecture)、平台驱动(Platform driver)、框架驱动(Framework driver)以及兼容支持模块(Compatibility support module)等模块化组件,再往上才是EFI以及兼容模式的实现。接下来我们将分别对这些模块的功能进行介绍。
在整个EFI系统中,驱动执行环境处于基础性地位,它也被称为“Pre-EFI-Foundation(预EFI基础)”。在驱动执行环境的各个组件中, 负责与硬件直接交互的便是协议架构(Architecture protocol)模块,它具备与硬件直接交流的能力。在实际执行时,EFI对硬件参数的定义都是通过协议架构来传递的,这一点EFI与传统BIOS并无 本质的区别。而决定EFI实现功能的是平台驱动和框架驱动,两者共同为EFI的实际执行提供完整的支撑。同时,EFI系统也包含一个兼容支持模块 (Compatibility support module,简称CSM),它可以在16位实模式下启动计算机以及访问扩展设备的ROM(只读存储器)。这样,即便PC平台中的部分硬件没有专门为 EFI设计(例如显卡、声卡等),EFI的兼容支持模块也可以让它们在整个系统中正常工作,从而有效降低从BIOS到EFI过渡的门槛。
图2 完全采用图形界面的Phoenix EFI OS Loader程序,类似于Windows应用程序,操作简单直观。
EFI系统的最顶层为“EFI操作系统装载器(EFI OS Loader)”和名为“预启动应用(Pre-boot application)”的扩展工具,EFI系统装载器可以引导操作系统启动,也能够提供一个设定屏幕—EFI同时支持传统的文本界面和图形界面,不过 后者显然成为EFI应用的绝对主流。与BIOS只能在640×480 VGA分辨率下显示不同,EFI在屏幕分辨率上并无限制,用户完全可以根据显示器硬件情况来使用更高的分辨率,从而提供更人性化、也更加美观的系统设定界 面。除了提供基本的硬件参数设定功能外,EFI OS Loader还允许用户设定操作系统的启动顺序(在计算机拥有多个操作系统的条件下),这相当于直接整合了OS启动管理器;其次,用户也可以通过EFI OS Loader界面来启动扩展工具,例如Ghost系统镜像、磁盘检测、EFI版本升级、病毒查杀或者其他的安全软件等等。我们可以从图2-图4中看到 Phoenix、Insyde和AMI公司的EFI OS Loader界面外观。如果没有特别指出,相信大家都会把它当作是本地Windows应用程序,两者在外观界面上如出一辙。只要开发商愿意,EFI的图形 界面完全可以变得更加漂亮或更富个性化,而用户也可以为EFI OS Loader选择一幅漂亮的背景图像,这远比BIOS冷冰冰的蓝底白字来得人性化。
在系统开机,完成硬件初始化工作后,EFI会对计算机发出指令开始加载操作系统,而当操作系统启动并正常运行之后,EFI与操作系统之间的通讯并不会被切 断,而是在ACPI高级电源管理功能的控制下继续进行。这样,操作系统就能够正确识别硬件,并为其分配资源,同时也可管理设备的电能消耗,此时EFI的职 能与传统BIOS并无不同。
EFI平台
EFI拥有自己的运行界面、基础驱动和应用程序,它实际上就是一个专用的嵌入式操作系统。当然,EFI与Windows、Mac
Os和Linux这类通用型操作系统有本质性的区别,如EFI不支持多任务或多线程,在任一时刻它都只能支持单一的任务。我们知道,EFI拥有自己的
GUI图形界面,能够直接读取硬盘,用户可以使用鼠标进行点击操作,这就意味着EFI拥有自己的显卡、芯片组、硬盘控制器以及鼠标驱动,这些驱动程序都是
以压缩的二进制文件存在,但功能仅限于为EFI运行提供基础环境,例如实现彩色GUI输出、对硬盘进行读取和写入等等,它们与操作系统的3D加速驱动、硬
盘控制器驱动并不是同一个概念—这也就是我们前面所介绍的“平台驱动(Platform
driver)”。EFI平台驱动与硬件的通讯通过一个与硬件无关的架构协议进行,不管你使用什么样的处理器、芯片组或者显卡,EFI的架构协议都不会受
到任何影响,在图1所示的EFI系统模型中,该模块被称为“Protocol
architecture”。EFI的文件格式以Fat32格式为基础,这样它就能够访问到容量更大的存储资源,升级新版本的EFI、为EFI添加新的扩
展工具都可以在此基础上进行。
图3 EFI可提供强大的扩展工具,允许用户直接通过EFI来管理计算机,用户还可以通过EFI版本升级来实现更多的扩展功能。
在EFI系统中,预启动应用(Pre-boot application)与EFI OS Loader同样都位于最顶层,所谓“预启动应用”,指的便是EFI的扩展工具。这些扩展工具一般都是由主板厂商自行设计,EFI系统只是提供一个标准化 的运行接口,主板厂商可以根据自己的要求设计功能不同的扩展工具。一般来说,EFI整合的扩展工具以系统维护、硬盘修复、底层杀毒为主,在它们的辅助下, 计算机将变得更加安全和更容易维护。例如在现有PC中,如果你要对系统作Ghost镜像,那就必须使用启动光盘、启动型闪存盘或者可靠性极差的启动软盘; 如果你要恢复系统,同样也必须借助软盘、闪存盘或光盘启动系统,系统镜像或恢复操作也相对专业,只有少数有经验的用户才能够完成这些操作。倘若你用的是不 带光驱的轻薄型笔记本电脑,恰好闪存盘的启动功能失常(此种情况很常见),那么系统镜像和恢复工作就会让人大伤脑筋。同样,如果系统遭受病毒袭击或者硬盘 损坏,操作系统无法启动,病毒查杀和数据抢救都非常困难。但在EFI系统中,这类安全工具都被直接整合,系统的维护工作变得相当轻松,换个角度看这也相当 于提高了PC的可靠性。
强大的远程维护功能是EFI的又一亮点。如果你对无盘站略有了解,一定会知道英特尔的PXE(Pre-boot Execution Environment)协议,该协议分为客户端和服务器端。客户端在网卡的ROM里,当计算机引导时,BIOS会将PXE客户端调入内存执行,同时网络 中DHCP服务器会给PXE客户端网卡分配一个IP地址,接着PXE客户端会自动连接到服务器,并将存储在该服务器的操作系统下载到本地运行。英特尔在设 计EFI时,就决定将PXE作为EFI的一个嵌入模块,这样任何一部采用EFI技术的计算平台,都可以支持PXE模式运行。除了直接运行远程系统外,你还 可以借助网络来启动计算机并安装操作系统,但与现有PC采用的PXE 2.0协议不同,EFI系统的PXE功能既可以运行在16位实模式下,也可支持32位保护模式运行,这意味着网络传输的速度更快,用户可以在更短的时间内 完成网络启动以及操作系统的安装任务。
告别汇编程序
采用不同的编程语言是EFI与传统BIOS的又一个重大差异。我们知道,BIOS采用汇编语言编写,虽然汇编具有高效率的优点,但程序编写难度大,非常不
利于增加新功能,而且代码检查纠错都相当困难,这不仅限制了BIOS的功能拓展,甚至也影响到BIOS的稳定性。与之不同,EFI采用C语言,熟悉程序设
计的读者应该都知道,C具有较高的硬件效率,程序编制和代码调试也都很容易,它也因此被称为中级语言。得益于此,EFI的编写将远比BIOS来得容易,程
序Bug更少、质量更高,版本的更新也将更有保证,在提高稳定性的同时大大减轻开发人员的负担;同时,主板厂商也能够顺利编制出各类型的EFI增强工具,
增强自身产品的竞争力,这也有助于EFI的广泛普及。
图4 AMI代号为“Aptio”的EFI,设定项目类似于BIOS,但采用人性化的图形界面。
EFI与操作系统
阻碍EFI进入广泛应用的门槛在于操作系统支持,当前针对PC的Windows系统都只能支持传统的BIOS,只有针对安腾平台的服务器操作系统才能够支
持EFI,这在客观上限制了EFI进入PC。外界一度认为,微软Windows
Vista将成为首款支持EFI的操作系统,但微软最近表示,首个Vista仍然为传统BIOS设计,暂不支持EFI,这给对EFI热情满怀的人们泼了一
大盆冷水。至于32位的Vista,将永远不支持EFI技术—这一点无可厚非,毕竟32位PC都基于BIOS设计且濒临淘汰,增加EFI支持没有多大意
义。保守估计,我们必须等到Windows Vista的升级版本方能够看到EFI的身影,这将大大延后Windows PC对EFI的支持进度。
但在Windows之外,其他操作系统对EFI的态度非常积极,苹果公司成为第一家在X86 PC中采用EFI技术的厂商。1月份,苹果公司推出酷睿双核平台的Macbook pro笔记本电脑,该产品率先引入EFI技术而成为另类,同时这也给许多有意在Mac机上安装Windows的用户带来困扰。由于固件接口存在根本性差 异,外界普遍认为用户无法在Macbook pro上安装Windows XP。但没过多久,一位发烧友通过修改Windows XP核心文件,顺利完成EFI支持,Windows XP也因此得以被顺利安装在Macbook pro笔记本中。但这并不是说EFI支持就如此轻而易举,事实上,这种破解只能说绕过了EFI技术的限制,而不是真正对EFI提供原生型的支持,两者在硬 盘启动引导机理方面存在本质性的区别—为BIOS设计的操作系统都依赖MBR(Master Boot Record Format,主引导扇区)来管理硬盘资源,而EFI原生支持的操作系统采用全新的GPT(Globally Unique Identifier Partition Table Format,全局唯一识别分区表格式)技术。
我们知道,MBR位于硬盘的第一个扇区,它所记录的便是硬盘的分区信息。如果我们使用Fdisk、Partition Magic或者直接在Windows安装过程中对硬盘进行分区,分区的信息都被写入到硬盘的MBR中,硬盘就根据MBR的内容来确定自己的逻辑分区情况。 MBR最多可支持四个主分区或三个主分区、一个扩展分区的组合,分区的最高容量为2TB,在硬盘容量未达到1TB的今天,2TB容量限制显然是非常宽裕 的;扩展分区内又包含许多逻辑分区,但逻辑分区采用字母卷标,因此扣除主分区外,逻辑分区的数量最多为23个(从字母D开始计算)。对桌面PC而言,这样 的分区规格远未达到瓶颈,至少在未来5年内MBR都不会遇到问题。然而,EFI改用了极富前瞻性的GPT技术,分区容量方面,GPT理论上允许你使用最高 18EB容量(1EB=1百万TB),这绝对是一个高得令人匪夷所思的数字,或许未来的DNA存储可以达到这一要求。其次,GPT允许一个硬盘中存在 128个主分区,每个分区都拥有唯一的ID标识码,可管理的存储资源范围远远超过MBR。目前,安腾版Windows和Windows 2003 Server系统都已经对GPT技术提供初步的支持,但启动分区器仍然采用MBR技术。另外,苹果公司的X86版Mac OS X Tiger操作系统直接采用EFI技术,但是否以GPT技术来代替MBR管理硬盘分区尚不知晓,再说现在MBR远未成为瓶颈,GPT与MBR在实际应用中 不会有任何差别。
与微软迟缓的态度形成鲜明对比,Linux业界对EFI非常积极,加上英特尔的鼎力支持,Linux内核目前已实现对EFI的支持,国内中科红旗推出的
RedFlag 5.0桌面版就率先提供EFI支持,相信不必等太长时间,其他Linux发行版也将陆续支持EFI。
注解:EFI的早期发起者为英特尔、AMI和台湾的Insyde,后来英特尔为更好的推进EFI技术,遂主导成立了开放性的UEFI(Unified EFI)论坛(www.uefi.org)
来统一负责EFI标准制定事务。除了英特尔外,UEFI论坛的主要成员还包括AMD、AMI、Dell、HP、IBM、Insyde、Microsoft
和Phoenix;基本上,UEFI基于EFI
1.10规范为基础,目前UEFI论坛正在制定最新的2.0版标准,或许等正式发布的时候,它可能会被正式命名为“UEFI(Unified
Extensible Firmware Interface)统一可扩展固件接口”。
EFI何日可至
如前所述,EFI已经在安腾服务器/工作站平台取代传统的BIOS技术,在X86 PC领域,苹果公司的Macbook
Pro成为EFI的首个实践者,但Windows
PC何时能够全面采用EFI还没有定论。在英特尔的计划表上,EFI将从2006年开始全面取代BIOS,但Windows
Vista的保守态度令这个计划成为泡影,估计微软要到2007年中期之后才可能让Vista支持EFI,这意味着EFI的实用化又将继续推迟。不过,我
们看到固件厂商和硬件业界都为此做好了准备,作为两大固件厂商,Phoenix和AMI都在紧张地进行自己的EFI项目。AMI代号为“Aptio”的
EFI项目接近完工,目前AMI已经向主板厂商提供相应的开发包;Phoenix则是与微软携手合作,将EFI嵌入到微软的“Trusted Core
BIOS”中,这个项目也即将完成。