(U)EFI
2018-12-23 13:22:40 阿炯

本站赞助商链接,请多关照。 可扩展固件接口(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)。

统一可扩展固件接口(英语:Unified Extensible Firmware Interface,缩写UEFI)是一种个人计算机系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案。可扩展固件接口负责加电自检(POST)、联系操作系统以及提供连接操作系统与硬件的接口。

UEFI的前身是Intel在1998年开始开发的Intel Boot Initiative,后来被重命名为可扩展固件接口(Extensible Firmware Interface,缩写EFI)。Intel在2005年将其交由统一可扩展固件接口论坛(Unified EFI Forum)来推广与发展,为了凸显这一点,EFI也更名为UEFI(Unified EFI)。UEFI论坛的创始者是11家知名计算机公司,包括Intel、IBM等硬件厂商,软件厂商Microsoft,及BIOS厂商AMI、Insyde及Phoenix。

众所周知,英特尔在近二十年来引领以x86系列处理器为基础的PC技术潮流,其产品如CPU,芯片组等在PC生产线中占据绝对领导的位置。因此,不少人认为此举显示英特尔公司欲染指固件产品市场的野心。事实上,EFI技术源于英特尔安腾处理器(Itanium)平台的推出。安腾处理器是英特尔瞄准服务器高端市场投入近十年研发力量设计产生的与x86系列完全不同的64位新架构。在x86系列处理器进入32位的时代,由于兼容性的原因,新的处理器(80386)保留16位的运行方式(实模式),此后多次处理器的升级换代都保留这种运行方式。甚至在包含EM64T技术的至强系列处理器中,处理器加电启动时仍然会切换到16位的实模式下运行(BIOS)。英特尔将这种情况归咎于BIOS技术的发展缓慢。自从IBM PC兼容机厂商通过净室的方式复制出第一套BIOS源程序,BIOS就以16位汇编代码,寄存器参数调用方式,静态链接,以及1MB以下内存固定编址的形式存在十几年。虽然由于各大BIOS厂商近年来的努力,有许多新元素添加到产品中,如PnP BIOS、ACPI、传统USB设备支持等等,但BIOS的根本性质没有得到任何改变。这迫使英特尔在开发新的处理器时,都必须考虑加进使性能大大降低的兼容模式。然而,安腾处理器并没有这样的顾虑,它是一个新生的处理器架构,系统固件和操作系统之间的接口都可以完全重新定义。并且这一次,英特尔将其定义为一个可扩展的,标准化的固件接口规范,不同于传统BIOS的固定的,缺乏文档的,完全基于经验和晦涩约定的一个事实标准。基于EFI的第一套系统产品的出现至今已经有五年的时间,如今,英特尔试图将成功运用在高端服务器上的技术推广到市场占有率更有优势的PC产品线中,并承诺在2006年间会投入全力的技术支持。


统一可扩展固件接口(UEFI)和BIOS

BIOS多使用CMOS芯片保存BIOS设置值与硬件侦测数据,CMOS保存数据需要电力供应,如果主板上的CMOS电池已没有电量,那么在计算机断电后,CMOS中存储的数据会丢失,且系统时钟无法运作。UEFI多采用NVRAM存储固件设置及硬件侦测数据。一些人认为BIOS只不过是由于兼容性问题遗留下来的无足轻重的部分,不值得为它花费太大的升级努力。而反对者认为,当BIOS的出现约制了PC技术的发展时,必须有人对它作必要的改变。

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驱动程序文件(如文件系统驱动程序)。实际上大部分OEM PC的UEFI BIOS会在UEFI引导功能表上提供运行内置诊断程序、内置还原程序的功能。EFI应用程序和EFI驱动程序可以是PE格式的.efi文件,可用C语言编写。在UEFI引导模式下,操作系统的启动程序也是EFI应用程序,启动程序的EFI文件存储在EFI系统分区(ESP)上。操作系统的启动程序将控制权交给操作系统并运行UEFI函数ExitBootServices()后,停止UEFI的Boot Services,结束由UEFI固件控制硬件的阶段,由操作系统直接控制硬件,UEFI的少部分服务如Runtime Services、UEFI GOP(操作系统加载显卡驱动程序后则不再使用UEFI GOP)等等则继续工作,为操作系统提供系统时间等功能。

UEFI和BIOS比较

二者显著的区别就是EFI是用模块化,C语言风格的参数堆栈传递方式,动态链接的形式构建的系统,较BIOS而言更易于实现,容错和纠错特性更强,缩短了系统研发的时间。
BIOSUEFI
16位实模式下运行运行于32位或64位模式
BIOS利用挂载真实模式中断的方式增加硬件功能将一段类似于驱动的16位代码,放置在固定的0x000C0000至0x000DFFFF之间存储区中,运行这段代码的初始化部分,它将挂载实模式下约定的中断矢量向其他程序提供服务
BIOS提供的服务在现实中只能提供给操作系统引导程序或MS-DOS类操作系统使用具有良好的向下兼容性和被外部访问的特性。
不支持secure boot支持secure boot

可扩展固件接口(UEFI)的组成

x64计算机平台的UEFI通常包含以下几个部分:
    Pre-EFI初始化模块
    EFI驱动程序执行环境(DXE)
    EFI驱动程序
    兼容性支持模块(CSM)
    EFI应用程序
    GUID磁盘分区表

在实现中,统一可扩展固件接口(UEFI)初始化模块和驱动执行环境通常被集成在一个只读存储器中。Pre-EFI初始化程序在系统开机的时候最先得到执行,完成存储器的初始化工作,然后加载UEFI DXE(驱动程序执行环境)。当DXE被加载运行时,系统便具有了枚举并加载其他UEFI驱动程序的能力。在基于PCI Express架构的x64计算机系统中,系统会加载UEFI内置的驱动程序模块,完成UEFI固件、CPU、存储器、芯片组及主板的进一步初始化,然后初始化各PCIe控制器、PCIe适配器(如RAID扩展卡或显卡)及芯片组内置PCIe适配器(如芯片组内置的SATA、USB、网卡等功能)并加载这些PCIe设备的UEFI驱动程序(如果有的话,也有可能是加载PCIe设备的Legacy Option ROM)。

操作系统支持

Linux内核自2000年开始,已经支持EFI启动。早期使用ELILO作为EFI下的启动程序。现在,GRUB的EFI版本已代替ELILO,大多数Linux发行版已使用GRUB作为UEFI下的启动程序。从Linux版本3.15起,来自英代尔的工程师Matt Fleming将64位核心提供了支持32位UEFI固件的可能,前提只需要UEFI操作系统启动程序支持EFI handover协议 ,譬如流行的GRUB2。同样流行的32位版Linux,譬如Ubuntu 16.04.3 LTS,也可以使用这类启动程序在64位版UEFI固件的机器上使用。

安腾版本的Windows 2000已于2002年加入对EFI 1.10的支持。安腾版本的Windows Server 2003和Windows XP 64-Bit Edition(以IA-64架构作为运行平台)已支持EFI。

从Windows Vista SP1开始,x86-64架构的Windows操作系统已支持UEFI。但是,若在UEFI模式下安装和启动Windows Vista SP1(或Windows Server 2008)或Windows 7(或Windows Server 2008 R2)通常需要在UEFI固件设置中打开CSM,因为Windows 7/Windows Server 2008 R2并不支持原生UEFI显示使用的UEFI GOP协议。32位的Windows Vista和Windows 7不支持UEFI启动。从Windows 8开始,支持Secure Boot,UEFI模式下的启动亦无须CSM(支持原生UEFI),32位版本的Windows 8亦支持32位的UEFI(不支持64位的UEFI)。

现在,x86-64架构的FreeBSD、OpenBSD和NetBSD已支持UEFI。

EFI 系统分区(也称为 ESP 或者 EFISYS)是一个 FAT32 格式的物理分区 (在硬盘主分区表上,而不是 LVM 或软件 RAID 等等) ,从这里 UEFI 固件启动 UEFI 引导器和应用程序。它与操作系统无关而是作为 EFI 固件要启动的引导器和应用程序的存储空间,是 UEFI 启动所必须。推荐使用 GPT 和 UEFI 搭配因为有的 UEFI 固件不支持 UEFI-MBR 启动。

虚拟机对UEFI的模拟支持

VMware Workstation支持对UEFI的模拟,但是在VMware Workstation 11以前,VMware Workstation并未正式支持UEFI,需要手动编辑虚拟机的.vmx文件以打开虚拟机的UEFI。VMware Workstation 11及以后的版本正式支持对UEFI的模拟。从VMware Workstation 14开始支持Secure Boot。

VirtualBox支持对UEFI的模拟,但是VirtualBox的UEFI并不支持Windows Vista和Windows 7。

QEMU/KVM可通过OVMF支持对UEFI的模拟。

微软Hyper-V的第二代虚拟机支持对UEFI的模拟,以及Secure Boot。


UEFI 2.10/ACPI 6.5 规范发布,引入对 LoongArch/RISC-V 架构支持

2022年8月下旬消息, UEFI 论坛宣布发布统一可扩展固件接口 (UEFI) 2.10 规范和高级配置和电源接口 (ACPI) 6.5 规范。

uEFI = universal Extensible Firmware Interface (统一可扩展固件接口) ,是一个可扩展的,标准化的统一固件接口规范,它采用模块化、动态链接和 C 语言风格的常数堆栈传递方式来构建系统,摆脱了传统 BIOS 复杂的 16 位汇编代码。

新规范版本扩展了对新的处理器类型、内存接口和平台类型的支持,同时实现了后量子系统安全性中的加密敏捷性。UEFI 2.10 规范亮点:
引入 UEFI 一致性配置文件,允许支持更多类型的平台和实现代码库
加密敏捷性,包括 SHA-384/SHA-512 签名方案,支持 Authenticated Variables
新的 LoongArch 和 RISC-V 处理器架构支持
添加机密计算扩展

一致性配置文件功能将 UEFI 可支持的平台类型扩展到更广泛的平台类型,如物联网、嵌入式和汽车空间,而不是局限于 PC。ACPI 6.5 规范亮点:
CXL 内存支持
LoongArch 处理器架构支持
机密计算事件日志支持
USB-C USB4 支持

要了解更多信息,请访问 UEFI 论坛规范网页上的 UEFI 2.10 规范和 ACPI 6.5 规范。


参考来源:
统一可扩展固件接口

EFI system partition