可扩展固件接口(EFI)最初是由英特尔开发,于2002年12月英特尔释出其订定的版本——1.1版,之后英特尔不再有其他关于EFI的规范格式发布。有关EFI的规范,英特尔已于2005年将此规范格式交由UEFI论坛来推广与发展,后来并更改名称为Unified EFI(UEFI)。UEFI论坛于2007年1月7日释出并发放2.1版本的规格,其中较1.1版本增加与改进了加密编码(cryptography)、网络认证(network authentication)与用户接口架构(User Interface Architecture)。
2009年5月9日,发布2.3版本。
众所周知,英特尔在近二十年来引领以x86系列处理器为基础的PC技术潮流,其产品如CPU,芯片组等在PC生产线中占据绝对领导的位置。因此,不少人认为此举显示英特尔公司欲染指固件产品市场的野心。事实上,EFI技术源于英特尔安腾处理器(Itanium)平台的推出。安腾处理器是英特尔瞄准服务器高端市场投入近十年研发力量设计产生的与x86系列完全不同的64位新架构。在x86系列处理器进入32位的时代,由于兼容性的原因,新的处理器(80386)保留16位的运行方式(实模式),此后多次处理器的升级换代都保留这种运行方式。甚至在包含EM64T技术的至强系列处理器中,处理器加电启动时仍然会切换到16位的实模式下运行(BIOS)。英特尔将这种情况归咎于BIOS技术的发展缓慢。自从IBM PC兼容机厂商通过净室的方式复制出第一套BIOS源程序,BIOS就以16位汇编代码,寄存器参数调用方式,静态链接,以及1MB以下内存固定编址的形式存在十几年。虽然由于各大BIOS厂商近年来的努力,有许多新元素添加到产品中,如PnPBIOS、ACPI、传统USB设备支持等等,但BIOS的根本性质没有得到任何改变。这迫使英特尔在开发新的处理器时,都必须考虑加进使性能大大降低的兼容模式。用一个比喻来讲:这就像保时捷新一代的全自排跑车,被人套上去一个蹩脚打档器。
然而,安腾处理器并没有这样的顾虑,它是一个新生的处理器架构,系统固件和操作系统之间的接口都可以完全重新定义。并且这一次,英特尔将其定义为一个可扩展的,标准化的固件接口规范,不同于传统BIOS的固定的,缺乏文档的,完全基于经验和晦涩约定的一个事实标准。基于EFI的第一套系统产品的出现至今已经有五年的时间,如今,英特尔试图将成功运用在高端服务器上的技术推广到市场占有率更有优势的PC产品线中,并承诺在2006年间会投入全力的技术支持。
二者显著的区别就是UEFI是用模块化,C语言风格的参数堆栈传递方式,动态链接的形式构建的系统,较BIOS而言更易于实现,容错和纠错特性更强,缩短了系统研发的时间。它可以运行于x86-64、IA32、IA64等架构上(在个人电脑上通常是x86-64平台),突破传统16位代码的寻址能力,达到处理器的最大寻址。它利用加载EFI驱动程序的形式,识别及操作硬件,不同于BIOS利用挂载真实模式中断的方式增加硬件功能。后者必须将一段类似于驱动程序的16位代码(如RAID卡的Option ROM)放置在固定的0x000C0000至0x000DFFFF之间存储区中,运行这段代码的初始化部分,它将挂载实模式下约定的中断向量向其他程序提供服务。例如,VGA图形及文本输出中断(INT 10h),磁盘访问中断服务(INT 13h)等等。由于这段存储空间有限(128KB),BIOS对于所需放置的驱动程序代码大小超过空间大小的情况无能为力。另外,BIOS的硬件服务程序都以16位代码的形式存在,这就给运行于增强模式的操作系统访问其服务造成了困难。因此BIOS提供的服务在现实中只能提供给操作系统引导程序或MS-DOS类操作系统使用。而UEFI系统下的驱动程序可以由EFI Byte Code(EBC)编写而成,EFI Byte Code是一组专用于EFI驱动程序的虚拟机器语言,必须在EFI驱动程序运行环境(Driver Execution Environment,或DXE)下被解释运行。采用EBC编写的EFI驱动程序拥有向下兼容性,打个比方说,一个带有EFI驱动程序的扩展设备,既可以将其安装在安腾处理器的系统中,也可以安装于支持UEFI的64位/32位PC系统中,而它的EFI驱动不需要重新编写。这样就无需对系统升级带来的兼容性因素作考虑。另外,由于EFI驱动程序开发简单,所有的PC部件提供商都可以参与,情形非常类似于现代操作系统的开发模式,这个开发模式曾使Windows在短短的两三年时间内成为功能强大,性能优越的操作系统。基于EFI的驱动模型可以使UEFI系统接触到所有的硬件功能,在操作系统运行以前浏览万维网站,实现图形化、多语言的BIOS设置界面,或者无需运行操作系统即可线上更新BIOS等等不再是天方夜谭,甚至实现起来也非常简单。这对基于传统BIOS的系统来说是件难以实现的任务,在BIOS中添加几个简单的USB设备支持都曾使很多BIOS设计师痛苦万分,更何况除了添加对无数网络硬件的支持外,还得凭空构建一个16位模式下的TCP/IP协议栈。
一些人认为BIOS只不过是由于兼容性问题遗留下来的无足轻重的部分,不值得为它花费太大的升级努力。而反对者认为,当BIOS的出现约制了PC技术的发展时,必须有人对它作必要的改变。
一般认为,UEFI由以下几个部分组成:
Pre-EFI初始化模块
EFI驱动程序执行环境
EFI驱动程序
兼容性支持模块(CSM)
EFI高层应用
GUID磁盘分区表
在实现中,统一可扩展固件接口(UEFI)初始化模块和驱动执行环境通常被集成在一个只读存储器中。Pre-EFI初始化程序在系统开机的时候最先得到执行,它负责最初的CPU,芯片组及存储器的初始化工作,紧接着载入EFI的驱动程序执行环境(DXE)。当DXE被载入运行时,系统便具有了枚举并加载其他EFI驱动程序的能力。在基于PCI架构的系统中,各PCI桥及PCI适配器的EFI驱动程序会被相继加载及初始化;这时,系统进而枚举并加载各桥接器及适配器后面的各种总线及设备的EFI驱动程序,周而复始,直到最后一个设备的EFI驱动程序被成功加载。正因如此,EFI驱动程序可以放置于系统的任何位置,只要能保证它可以按顺序被正确枚举。例如一个具PCI-E总线接口的RAID存储适配器,其EFI驱动程序一般会放置在这个设备的匹配PCI规范的扩展只读存储器(PCI Expansion ROM)中,当PCI总线驱动程序被加载完毕,并开始枚举其子设备时,这个存储适配器旋即被正确识别并加载它的EFI驱动程序。部分EFI驱动程序还可以放置在某个磁盘的EFI系统分区(ESP)中,只要这些驱动程序不是用于加载这个磁盘的驱动的必要部件。在EFI规范中,一种突破传统MBR磁盘分区结构限制的GUID磁盘分区系统(GPT)被引入,新结构中,磁盘的主分区数不再受限制(在MBR结构下,只能存在4个主分区),另外EFI/UEFI+GUID结合还可以支持2.1 TB以上硬盘(有测试显示,3TB硬盘使用MBR,并且安装Windows 6.x 64位系统,只能识别到2.1TB),并且分区类型将由GUID来表示。在众多的分区类型中,EFI系统分区可以被UEFI固件访问,可用于存放操作系统的引导程序、EFI应用程序和EFI驱动程序。EFI系统分区采用FAT文件系统,容量较小,在Windows操作系统下,默认是隐藏的。UEFI固件通过运行EFI系统分区中的启动程序启动操作系统。CSM是在x86平台UEFI系统中的一个特殊的模块,它将为不具备UEFI引导能力的操作系统(如Windows XP)以及16位的传统Option ROM(即非EFI的Option ROM)提供类似于传统BIOS的系统服务。Secure Boot和CSM不兼容,因此在UEFI固件设置中打开CSM前,需要在UEFI固件设置中关闭Secure Boot。
UEFI在概念上非常类似于一个低阶的操作系统,并且具有操控所有硬件资源的能力。不少人感觉它的不断发展将有可能代替现代的操作系统。事实上,EFI的缔造者们在第一版规范出台时就将EFI的能力限制于不足以威胁操作系统的统治地位。首先,它只是硬件和预启动软件间的接口规范;其次,UEFI环境下不提供中断的机制,也就是说每个EFI驱动程序必须用轮询(polling)的方式来检查硬件状态,并且需要以解释的方式运行,较操作系统下的机械码驱动效率更低;再则,UEFI系统不提供复杂的缓存器保护功能,它只具备简单的缓存器管理机制,具体来说就是指运行在x64或x86处理器的64位模式或保护模式下,以最大寻址能力为限把缓存器分为一个平坦的段(Segment),所有的程序都有权限访问任何一段位置,并不提供真实的保护服务。当UEFI所有组件加载完毕时,便会启动操作系统的启动程序,如果UEFI固件内置EFI Shell,也可以启动EFI Shell命令提示(部分UEFI固件内置EFI Shell),在这里,用户可以调入执行EFI应用程序,这些EFI程序可以是OEM提供的硬件检测软件,OEM提供的备份软件,引导管理软件,操作系统的启动程序等等,也可以加载EFI分区(ESP)中的EFI驱动程序(如文件系统驱动程序)。EFI应用程序和EFI驱动程序可以是PE格式的.efi文件,可用C语言编写。在UEFI引导模式下,操作系统的启动程序也是EFI应用程序,启动程序的EFI文件存储在EFI系统分区(ESP)上。理论上来说,对于EFI应用程序的功能并没有任何限制,任何人都可以编写这类软件,并且效果较以前MS-DOS下的软件更华丽,功能更强大。一旦引导软件将控制权交给操作系统,所有用于引导的服务代码将全部停止工作,部分运行时,代服务程序还可以继续工作,以便于操作系统一时无法找到特定设备的驱动程序时,该设备还可以继续被使用。
UEFI固件区分架构,在UEFI引导模式下,通常只能运行特定架构的UEFI操作系统和特定架构的EFI应用程序(EBC程序除外)。比如,采用64位UEFI固件的PC,在UEFI引导模式下只能运行64位操作系统启动程序;而在Legacy引导模式(即BIOS兼容引导模式)下,通常不区分操作系统的比特数,既可以运行16位的操作系统(如DOS),也可以运行32位或64位的操作系统,和BIOS一样。
英特尔无疑是推广EFI的积极因素,近年来由于业界对其认识的不断深入,更多的厂商正投入这方面的研究。包括英特尔,AMD在内的一些PC生产厂家联合成立了UEFI论坛。另外各大BIOS提供商如Insyde,Phoenix,AMI等,他们原先被认为是EFI发展的阻碍力量,现在也不断的推出各自的解决方案。分析人士指出,这是由于BIOS厂商在EFI架构中重新找到了诸如Pre-EFI启动环境之类的市场位置,然而随着EFI在PC系统上的成功运用,以及英特尔新一代芯片组的推出,这一部分市场份额将会不出意料的在英特尔的掌控之中。2011年以后生产的零售主板大多数采用UEFI技术。随后,微软又要求,预装Windows 8的电脑,必须采用UEFI引导模式,以及Secure Boot。部分采用EFI技术的BIOS并不支持EFI引导。
类别0,这类系统使用x86 BIOS固件,只支持传统操作系统。
类别1,这类系统采用支持UEFI和Pi规范的固件,激活CSM层功能,只支持传统操作系统。
类别2,这类系统采用支持UEFI和Pi规范的固件,激活CSM层功能,同时支持传统和UEFI启动的操作系统。
类别3,这类系统采用支持UEFI和Pi规范的固件,不再提供或完全关闭CSM层功能,只支持由UEFI启动的操作系统。
类别3+,在类别3的系统基础上提供并激活Secure Boot功能。
微软公司的Windows 8及之后的操作系统适用于上述所有类别的电脑,之前支持UEFI固件的操作系统适用于类别0至类别2型电脑,不支持UEFI固件的操作系统仅可用于类别0和类别1的电脑。所有支持UEFI启动的Linux操作系统适用于类别0至类别3型电脑,多数现行分发版也支持类别3+中的Secure Boot功能,譬如Ubuntu等。 Intel计划将于2020年推出的UEFI Class 3规范中,将Legacy BIOS界面完全舍弃,Intel旗下的所有产品将使用UEFI Class 3(有一部分产品可能是3+)。至2018年,部分x86架构设备已经彻底舍弃CSM,或者,在Legacy引导模式下,功能很有限。
BIOS即Basic Input/Output System,翻成中文是“基本输入/输出系统”,是一种所谓的“固件”,负责在开机时做硬件启动和检测等工作,并且担任操作系统控制硬件时的中介角色。
因为硬件发展迅速,传统式(Legacy)BIOS 成为进步的包袱,现在已发展出最新的UEFI(Unified Extensible Firmware Interface)可扩展固件接口,相比传统 BIOS 的来说,未来将是一个“没有特定 BIOS”的电脑时代。
与legacy BIOS 相比,UEFI最大的几个区别在于:
1. 编码99%都是由C语言完成;
2. 一改之前的中断、硬件端口操作的方法,而采用了Driver/protocol的新方式;
3. 将不支持X86实模式,而直接采用Flat mode(也就是不能用DOS了,现在有些 EFI 或 UEFI 能用是因为做了兼容,但实际上这部分不属于UEFI的定义了);
4. 输出也不再是单纯的二进制code,改为Removable Binary Drivers;
5. OS启动不再是调用Int19,而是直接利用protocol/device Path;
6. 对于第三方的开发,前者基本上做不到,除非参与BIOS的设计,但是还要受到ROM的大小限制,而后者就便利多了。
7.弥补BIOS对新硬件的支持不足的问题。
UEFI使用模块化设计,它在逻辑上可分为硬件控制和OS软件管理两部分:操作系统—可扩展固件接口—固件—硬件。
根据UEFI概念图的结构,可把uEFI概念划为两部分:uEFI的实体(uEFI Image)跟平台初始化框架。
UEFI的实体-UEFI Image
(图中蓝框围起部分)
根据UEFI规范定义,UEFI Image包含三种:uEFI Applications, OS Loaders and UEFI Drivers。
UEFI Applications是硬件初始化完,操作系统启动之前的核心应用,比如:启动管理、BIOS设置、uEFI Shell、诊断程式、调度和供应程式、调试应用...等等
OS Loaders是特殊的uEFI Application,主要功能是启动操作系统并退出和关闭UEFI应用。
UEFI Drivers是提供设备间接口协议,每个设备独立运行提供设备版本号和相应的参数以及设备间关联,不再需要基于操作系统的支持。
平台初始化框架
UEFI框架主要包含两部分,一是PEI(EFI预初始化),另一部分是驱动执行环境 (DXE)。
PEI主要是用来检测启动模式、加载主存储器初始化模块、检测和加载驱动执行环境核心。
DXE是设备初始化的主要环节,它提供了设备驱动和协议接口环境界面。
纠错特性
与BIOS显著不同的是,UEFI是用模块化、C语言风格的参数堆栈传递方式、动态链接的形式构建系统,它比BIOS更易于实现,容错和纠错特性也更强,从而缩短了系统研发的时间。更加重要的是,它运行于32位或64位模式,突破了传统16位代码的寻址能力,达到处理器的最大寻址,此举克服了BIOS代码运行缓慢的弊端。
兼容性
与BIOS不同的是,UEFI体系的驱动并不是由直接运行在CPU上的代码组成的,而是用EFI Byte Code(EFI字节代码)编写而成的。Java是以“Byte Code”形式存在的,正是这种没有一步到位的中间性机制,使Java可以在多种平台上运行。UEFI也借鉴了类似的做法。EFI Byte Code是一组用于UEFI驱动的虚拟机器指令,必须在UEFI驱动运行环境下被解释运行,由此保证了充分的向下兼容性。
一个带有UEFI驱动的扩展设备既可以安装在使用安卓的系统中,也可以安装在支持UEFI的新PC系统中,它的UEFI驱动不必重新编写,这样就无须考虑系统升级后的兼容性问题。基于解释引擎的执行机制,还大大降低了UEFI驱动编写的复杂门槛,所有的PC部件提供商都可以参与。
鼠标操作
UEFI内置图形驱动功能,可以提供一个高分辨率的彩色图形环境,用户进入后能用鼠标点击调整配置,一切就像操作Windows系统下的应用软件一样简单。
可扩展性
UEFI将使用模块化设计,它在逻辑上分为硬件控制与OS(操作系统)软件管理两部分,硬件控制为所有UEFI版本所共有,而OS软件管理其实是一个可编程的开放接口。借助这个接口,主板厂商可以实现各种丰富的功能。比如我们熟悉的各种备份及诊断功能可通过UEFI加以实现,主板或固件厂商可以将它们作为自身产品的一大卖点。UEFI也提供了强大的联网功能,其他用户可以对你的主机进行可靠的远程故障诊断,而这一切并不需要进入操作系统。
图形界面
目前UEFI主要由这几部分构成:UEFI初始化模块、UEFI驱动执行环境、UEFI驱动程序、兼容性支持模块、UEFI高层应用和GUID磁盘分区组成。
UEFI初始化模块和驱动执行环境通常被集成在一个只读存储器中,就好比如今的BIOS固化程序一样。UEFI初始化程序在系统开机的时候最先得到执行,它负责最初的CPU、北桥、南桥及存储器的初始化工作,当这部分设备就绪后,紧接着它就载入UEFI驱动执行环境(Driver Execution Environment,简称DXE)。当DXE被载入时,系统就可以加载硬件设备的UEFI驱动程序了。DXE使用了枚举的方式加载各种总线及设备驱动,UEFI驱动程序可以放置于系统的任何位置,只要保证它可以按顺序被正确枚举。借助这一点,我们可以把众多设备的驱动放置在磁盘的UEFI专用分区中,当系统正确加载这个磁盘后,这些驱动就可以被读取并应用了。在这个特性的作用下,即使新设备再多,UEFI也可以轻松地一一支持,由此克服了传统BIOS捉襟见肘的情形。UEFI能支持网络设备并轻松联网,原因就在于此。
值得注意的是,一种突破传统MBR(主引导记录)磁盘分区结构限制的GUID(全局唯一标志符)磁盘分区系统将在UEFI规范中被引入。MBR结构磁盘只允许存在4个主分区,而这种新结构却不受限制,分区类型也改由GUID来表示。在众多的分区类型中,UEFI系统分区用来存放驱动和应用程序。很多朋友或许对这一点感到担心:当UEFI系统分区遭到破坏时怎么办?而容易受病毒侵扰更是UEFI被人诟病的一大致命缺陷。事实上,系统引导所依赖的UEFI驱动通常不会存放在UEFI系统分区中,当该分区的驱动程序遭到破坏,我们可以使用简单方法加以恢复,根本不用担心。
X86处理器能够取得成功,与它良好的兼容性是分不开的。为了让不具备UEFI引导功能的操作系统提供类似于传统BIOS的系统服务,UEFI还特意提供了一个兼容性支持模块,这就保证了UEFI在技术上的良好过渡。
uEFI启动项
启动项2
全部
5518次播放01:09
每天都在用电脑的你,知道什么是UEFI吗
Copyright 2023 fuwu029.com赣ICP备2022008914号-4