引言
统一可扩展固件接口 (UEFI) 规范描述了操作系统和平台固件之间的接口。UEFI 之前是可扩展固件接口规范 1.10 (EFI)。因此,一些代码和某些协议名称保留了 EFI 名称。除非另有说明,本规范中的 EFI 名称可假定为 UEFI 的一部分。
该接口采用数据表的形式,其中包含与平台相关的信息,以及可供 OS 加载程序和 OS 使用的引导和运行时服务调用。它们共同提供了一个引导操作系统的标准环境。本规范是作为一个纯粹的接口规范设计的。因此,该规范定义了平台固件必须实现的接口和结构集。类似地,该规范定义了操作系统在引导时可能使用的一组接口和结构。无论是固件开发者选择如何实现所需的元素,还是操作系统开发者选择如何利用这些接口和结构,都由开发者自己决定。
该规范的目的是定义一种方法,使操作系统和平台固件仅通信支持操作系统引导过程所必需的信息。这是通过平台和固件提供给操作系统的软件可见接口的正式和完整的抽象规范来实现的。
本规范的目的是为操作系统和平台固件定义一种方式,以仅传递支持操作系统启动过程所需的信息。这是通过平台和固件呈现给操作系统的软件可见接口的抽象规范来实现的。
使用这一正式定义,旨在运行在与受支持的处理器规范兼容的平台上的收缩包装操作系统将能够在各种系统设计上启动,而无需进一步的平台或操作系统定制。该定义还允许平台创新引入新特性和功能,以增强平台的能力,而不需要按照操作系统的引导顺序编写新代码。
此外,抽象规范开辟了一条替代遗留设备和固件代码的路径。新的设备类型和相关代码可以通过相同定义的抽象接口提供同等的功能,同样不会影响 OS 引导支持代码。
该规范适用于从移动系统到服务器的所有硬件平台。该规范提供了一组核心服务以及一组协议接口。协议接口的选择可以随着时间的推移而发展,并针对不同的平台市场细分进行优化。与此同时,该规范允许 oem 提供最大限度的可扩展性和定制能力,以实现差异化。在这方面,UEFI 的目的是定义一个从传统的“PC-AT”风格的引导世界到一个没有遗留 API 的环境的进化路径。
UEFI 驱动模型扩展
对启动设备的访问是通过一系列的协议接口提供的。UEFI 驱动模型的一个目的是为 “PC-AT"式的 Option ROM(TODO)提供一个替代品。需要指出的是,写在 UEFI 驱动模型上的驱动,被设计为在预启动环境中访问启动设备。它们并不是为了取代高性能的、针对操作系统的驱动程序。
UEFI 驱动模型被设计为支持执行模块化的代码,也被称为驱动,在预启动环境中运行。这些驱动程序可以管理或控制平台上的硬件总线和设备,也可以提供一些软件衍生的、平台特定的服务。
UEFI 驱动模型还包含了 UEFI 驱动编写者所需的信息,以设计和实现平台启动 UEFI 兼容的操作系统可能需要的任何总线驱动和设备驱动的组合。
UEFI 驱动模型被设计为通用的,可以适应任何类型的总线或设备。UEFI 规范描述了如何编写 PCI 总线驱动程序、PCI 设备驱动程序、USB 总线驱动程序、USB 设备驱动程序和 SCSI 驱动程序。提供了允许将 UEFI 驱动程序存储在 PCI Option ROM 中的其他详细信息,同时保持了与旧 Option ROM 镜像的兼容性。
UEFI 规范的一个设计目标是使驱动镜像尽可能的小。然而,如果一个驱动程序需要支持多个处理器架构,那么也需要为每个支持的处理器架构提供一个驱动程序对象文件。为了解决这个空间问题,本规范还定义了 EFI 字节代码虚拟机(EFI Byte Code Virtual Machine)。一个 UEFI 驱动可以被编译成一个 EFI 字节代码对象文件。UEFI Specification-complaint(TODO)的固件必须包含一个 EFI 字节代码解释器。这使得支持多种处理器架构的单一 EFI 字节代码对象文件可以被运出。另一种节省空间的技术是使用压缩。该规范定义了压缩和解压算法,可用于减少 UEFI 驱动程序的大小,从而减少 UEFI 驱动程序存储在 ROM 设备中时的开销。
OSV、IHV、OEM 和固件供应商可以使用 UEFI 规范中包含的信息来设计和实现符合本规范的固件、生成标准协议接口的驱动程序以及可用于引导 UEFI 兼容的操作系统加载程序操作系统。
章节安排
本规范的章节组织如下:
章节名 | 内容 |
---|---|
引言/概述 | 介绍 UEFI 规范,并描述 UEFI 的主要组件。 |
启动管理器 | 管理器用于加载写入此规范的驱动程序和应用程序。 |
EFI 系统表和分区 | 描述了一个 EFI 系统表,它被传递给每个兼容的驱动程序和应用程序,并定义了一个基于 GUID 的分区方案。 |
块转换表 | 用于执行块 I/O 的布局和规则集,可提供单个块的断电写入原子性。 |
引导服务 | 包含在引导操作系统之前存在于 UEFI 兼容系统中的基本服务的定义。 |
运行时服务 | 包含在操作系统启动之前和之后存在于兼容系统中的基本服务的定义。 |
协议 | EFI 加载图像协议描述已加载到内存的 UEFI 镜像。 |
设备路径协议提供了在 UEFI 环境中构建和管理设备路径所需的信息。 | |
UEFI 驱动模型描述了一组服务和协议,适用于每个总线和设备类型。 | |
控制台支持协议定义了I/O协议,处理系统用户在启动服务环境中执行的基于文本的信息的输入和输出。 | |
媒介访问协议定义了加载文件协议,文件系统格式和媒介格式处理可移动媒介。 | |
PCI 总线支持协议定义 PCI 总线驱动程序,PCI 设备驱动程序和 PCI Option ROM 布局。所描述的协议包括 PCI 根桥 I/O 协议和 PCI I/O协议。 | |
SCSI 驱动程序模型和总线支持定义了 SCSI I/O协议和扩展SCSI Pass Thru 协议,用于抽象访问由 SCSI 主机控制器产生的 SCSI 通道。 | |
iSCSI协议定义了通过TCP/IP传输SCSI数据。 | |
USB 支持协议定义了 USB 总线驱动程序和 USB 设备驱动程序。 | |
调试器支持协议描述了一组可选的协议,提供所需的服务,以实现一个源级调试器的 UEFI 环境。 | |
压缩算法规范详细描述了压缩/解压缩算法,外加一个标准的EFI解压缩接口,用于启动时使用。 | |
ACPI 协议可用于从平台上安装或删除 ACPI 表。 | |
字符串服务:Unicode 排序协议允许在启动服务环境中运行的代码对给定语言的 Unicode 字符串执行词法比较函数;正则表达式协议用于根据正则表达式模式匹配 Unicode 字符串。 | |
EFI 字节码虚拟机 | 定义 EFI 字节码虚拟处理器及其指令集。它还定义了如何将 EBC 对象文件加载到内存中,以及从本机代码到 EBC 代码再转换到本机代码的机制。 |
固件更新和报告 | 为设备提供一个抽象,以提供固件管理支持。 |
网络协议 | SNP、PXE、BIS 和 HTTP 启动协议定义了在 UEFI 启动服务环境中执行时提供对网络设备访问的协议。 |
受管网络协议定义了 EFI 受管网络协议,它提供原始 (未格式化) 异步网络数据包 I/O 服务和托管网络服务绑定协议,用于定位 MNP 驱动支持的通信设备。 | |
VLAN、EAP、Wi-Fi 和 Supplicant 协议定义了一个协议,为 VLAN 配置提供可管理性接口。 | |
蓝牙协议定义。 | |
TCP、IP、PIPsec、FTP、GTLS 和 Configurations 协议定义了 EFI TCPv4 (Transmission Control Protocol version 4) 协议和 EFI IPv4 (Internet Protocol version 4) 协议。 | |
ARP、DHCP、DNS、HTTP 和 REST 协议定义了 ARP (Address Resolution Protocol) 协议接口和 EFI DHCPv4 协议。 | |
UDP 和 MTFTP 协议定义了 EFI UDPv4 (User Datagram Protocol version 4) 协议,该协议在 EFI IPv4 协议上接口,并定义了 EFI MTFTPv4 协议接口,该接口建立在 EFI UDPv4 协议之上。 | |
安全引导和驱动程序签名 | 介绍 Secure Boot 和生成 UEFI 数字签名的方法。 |
人机界面基础设施 (HII) | 定义实现人机接口基础设施 (HII) 所需的核心代码和服务,包括管理用户输入和相关协议的代码定义的基本机制。 |
描述用于管理系统配置的数据和 api:描述旋钮和设置的实际数据。 | |
用户标识 | 描述描述平台当前用户的服务。 |
安全技术 | 描述用于利用安全技术的协议,包括加密散列和密钥管理。 |
杂项协议 | Timestamp 协议提供了一个独立于平台的接口来检索高分辨率的时间戳计数器。当调用 ResetSystem 时,重置通知协议提供注册通知的服务。 |
附录 | GUID 和时间格式。 |
基于基本文本的控制台要求,符合 efi 系统需要提供通信能力。 | |
设备路径使用数据结构的例子,定义各种硬件设备的引导服务。 | |
状态代码列出了 UEFI 接口返回的成功、错误和警告代码。 | |
通用网络驱动程序接口定义了32/64位硬件和软件通用网络驱动程序接口(UNDIs)。 | |
使用简单指针协议。 | |
使用 EFI 扩展 SCISI 直通协议。 | |
压缩源代码的一个压缩算法的实现。 | |
一个 EFI 解压缩算法的实现的解压源代码。 | |
EFI 字节码虚拟机操作码列表提供了相应指令集的摘要。 | |
字母功能列表按字母顺序标识所有 UEFI 接口功能。 | |
EFI 1.10 协议变更和折旧清单标识了协议、GUID、修订标识符名称变更以及与 EFI 1.10 规范相比已弃用的协议。 | |
平台错误记录描述了用于表示平台硬件错误的常见平台错误记录格式。 | |
UEFI ACPI Data Table 定义了 UEFI ACPI 表格式。 | |
硬件错误记录持久性使用。 | |
引用 | |
术语表 | |
索引 | 提供规范中关键术语和概念的索引。 |
目标
“PC-AT”启动环境对行业内的创新提出了重大挑战。每一个新的平台功能或硬件创新都要求固件开发人员设计越来越复杂的解决方案,并且通常要求操作系统开发人员修改引导代码,然后客户才能从创新中受益。这可能是一个耗时的过程,需要大量的资源投资。
UEFI 规范的主要目标是定义一个替代引导环境,可以减轻这些考虑。在这个目标中,该规范类似于其他现有的引导规范。本规范的主要属性可以概括为以下属性:
一致的、可扩展的平台环境。该规范为固件定义了一个完整的解决方案,以描述所有平台特性和 OS 的 surface platform(TODO) 功能在引导过程中。这些定义非常丰富,足以涵盖一系列当代处理器设计。
从固件中抽象操作系统。该规范定义了平台功能的接口。通过使用抽象接口,该规范允许在构建 OS 加载器时,而无需了解作为这些接口基础的平台和固件。这些接口代表了底层平台和固件实现与操作系统加载程序之间定义良好的稳定边界。这样的边界允许底层固件和操作系统加载程序更改,前提是两者都将交互限制在定义的接口上。
合理的设备抽象,不需要遗留接口。“PC-AT”BIOS 接口要求操作系统加载程序对某些硬件设备的工作有特定的了解。该规范为 OS 加载器开发人员提供了一些不同的东西:抽象接口使得可以构建在一系列底层硬件设备上工作的代码,而无需明确了解该范围内每个设备的细节。
从固件中提取 Option ROM。该规范定义了平台功能的接口,包括 PCI、USB 和 SCSI 等标准总线类型。支持的总线类型可能会随着时间的推移而增加,因此包括了一种扩展到未来总线类型的机制。这些定义的接口以及扩展到未来总线类型的能力是 UEFI 驱动程序模型的组件。UEFI 驱动模型的一个目的是解决现有“PC-AT”Option ROM 中存在的广泛问题。与 OS 加载程序一样,驱动程序使用抽象接口,因此可以构建设备驱动程序和总线驱动程序,而无需了解作为这些接口基础的平台和固件。
架构上可共享的系统分区。扩展平台功能和添加新设备的计划通常需要软件支持。在许多情况下,当这些平台创新(TODO)在操作系统控制平台之前被激活时,它们必须由特定于平台而不是客户选择的操作系统的代码支持。解决这个问题的传统方法是在制造过程中将代码嵌入平台中(例如,在闪存设备中)。对这种持久存储的需求正在快速增长。该规范定义了大型海量存储媒介类型上的持久存储,以供平台支持代码扩展使用,以补充传统方法。规范中明确了其工作原理的定义,以确保固件开发商、OEM、操作系统供应商甚至第三方可以安全地共享空间,同时增加平台功能。
可以通过多种方式定义提供这些属性的引导环境。实际上,在编写本规范时,已经存在几种替代方案,从学术角度来看可能是可行的。然而,考虑到当前围绕支持的处理器平台的基础设施能力,这些替代方案通常会带来很高的门槛。本规范旨在提供上面列出的属性,同时也认识到行业的独特需求,该行业在兼容性方面进行了大量投资,并且拥有大量无法立即放弃的系统安装基础。这些需求推动了对本规范中体现的附加属性的要求:
- 进化性的,而不是革命性的。规范中的接口和结构旨在尽可能地减少初始实现的负担。虽然已经小注意保在接口本身中维护适当的抽象,但该设计还确保可以重用 BIOS 代码来实现接口,而只需要最少的额外编码工作。换句话说,在 PC-AT 平台上,规范最初可以作为基于现有代码的底层实现之上的薄接口(thin Interface TODO)层来实现。同时,抽象接口的引入提供了将来从遗留代码的迁移。一旦抽象被确立为固件和操作系统加载程序在引导期间交互的手段,开发人员就可以随意替换抽象接口下的遗留代码。类似的硬件遗留迁移也是可能的。由于抽象隐藏了设备的细节,因此可以移除底层硬件,并用提供改进功能、降低成本或两者兼而有之的新硬件替换它。显然,这需要编写新的平台固件来支持设备并通过抽象接口将其呈现给 OS 加载器。但是,如果没有接口抽象,则可能根本无法移除旧设备。
- 设计上的兼容性。系统分区结构的设计还保留了当前在“PC-AT”引导环境中使用的所有结构。因此,构建一个能够从同一磁盘引导传统操作系统或 EFI-aware 操作系统的单一系统是一件简单的事情。
- 简化了操作系统中立的平台增值的添加。该规范定义了一个开放的、可扩展的接口,它有助于创建平台“驱动程序”。这些可能类似于操作系统驱动程序,在引导过程中为新设备类型提供支持,或者它们可能用于实现增强的平台功能,例如容错或安全性。此外,这种扩展平台能力的能力从一开始就被设计到规范中。这旨在帮助开发人员避免在尝试将新代码挤入传统 BIOS 环境时所固有的许多挫败感。由于包含用于添加新协议的接口,OEM 或固件开发人员拥有以模块化方式向平台添加功能的基础设施。由于规范中定义的调用约定和环境,此类驱动程序可能会使用高级编码语言来实现。这反过来可能有助于降低创新的难度和成本。系统分区选项为此类扩展提供了非易失性存储器存储的替代方案。
- 建立在现有投入的基础上。在可能的情况下,规范避免在现有行业规范提供足够覆盖的领域重新定义接口和结构。例如,ACPI 规范为操作系统提供了发现和配置平台资源所需的所有信息。同样,规范设计的这种哲学选择旨在尽可能降低采用该规范的障碍。
目标受众
本文档主要适用于以下读者:
- 将实现 UEFI 驱动程序的 IHV 和 OEM。
- 将创建支持的处理器平台的 OEM 厂商,旨在启动 shrink-wrap(TODO)的操作系统。
- BIOS 开发人员,无论是创建通用 BIOS 和其他固件产品的人员,还是修改这些产品的支持人员。
- 操作系统开发人员将调整他们的 shrink-wrap(TODO)操作系统产品,用来在支持的基于处理器的平台上运行。
UEFI 设计概述
UEFI 的设计基于以下基本要素:
- 重用现有的基于表格的接口。为了保持对现有基础支持代码(包括操作系统和固件)的投资,必须在希望符合 UEFI 规范的平台上,实现通常在与支持的处理器规范兼容的平台上,实现的许多现有规范。 (有关更多信息,请参阅附录 Q:参考资料。)
- 系统分区。系统分区定义了一个分区和文件系统,可允许多个供应商之间安全共享,并用于不同目的。包含单独的、可共享的系统分区的能力提供了增加平台附加值的机会,而不会显著增加对非易失性平台存储器的需求。
- 引导服务。引导服务为可在引导期间使用的设备和系统功能提供接口。设备访问是通过“句柄”(handles)和“协议”(protocols) 抽象出来的。这有利于重用现有 BIOS 代码,将基本实现要求保持在规范之外,而不会给访问设备的消费者带来负担。
- 运行时服务。提供了一组最小的运行时服务,以确保对基础平台的硬件资源进行适当的抽象,这些资源可能是操作系统在正常运行时需要的。
图 1-1 描述了用于完成平台和操作系统引导的符合 UEFI 规范的系统的各种组件的交互。
平台固件能够从系统分区中检索操作系统加载器镜像。该规范提供了各种大容量存储设备类型,包括磁盘、CD-ROM 和 DVD,以及通过网络的远程启动。通过可扩展的协议接口,有可能增加其他的引导媒介类型,尽管如果这些媒介需要使用本文件中定义的协议以外的协议,可能需要修改操作系统加载器。
一旦启动,操作系统加载程序将继续引导整个操作系统。为此,它可以使用本规范或其他所需规范定义的 EFI 引导服务和接口来探测、解析和初始化各种平台组件和管理它们的操作系统软件。在引导阶段,EFI 运行时服务也可供 OS 加载器使用。
UEFI 驱动模型
本节描述了符合本规范的固件的驱动模型的目标。目标是让这个驱动模型为所有类型的总线和设备提供一个实现总线驱动和设备驱动的机制。在撰写本文时,支持的总线类型包括 PCI、USB 等。
随着硬件架构的不断发展,平台中存在的总线数量和类型也在不断增加。这种趋势在高端服务器中尤为明显。然而,更多样化的总线类型被设计到桌面和移动系统,甚至一些嵌入式系统中。这种日益增长的复杂性,意味着在预启动环境中,需要一种简单的方法来描述和管理平台中的所有总线和设备。UEFI 驱动模型以协议、服务和启动服务的形式提供了这种简单的方法。
UEFI 驱动程序模型目标
UEFI 驱动模型有以下目标:
- 兼容 – 符合此规范的驱动程序必须保持与 EFI 1.10 规范和 UEFI 规范的兼容性。这意味着 UEFI 驱动程序模型利用 UEFI 2. 0 规范中的可扩展性机制来添加所需的功能。
- 简单 - 符合本规范的驱动程序必须易于实现,易于维护。UEFI 驱动模型必须允许驱动编写者专注于正在开发的特定设备的驱动。驱动程序不应关注平台策略或平台管理问题。这些考虑应该留给系统固件。
- 可扩展性 - UEFI 驱动模型必须能够适应所有类型的平台。这些平台包括嵌入式系统、移动和桌面系统,以及工作站和服务器。
- 灵活 - UEFI 驱动模型必须支持枚举所有设备的能力,或者只枚举启动所需操作系统的那些设备。最小的设备枚举提供了对更快速的启动能力的支持,而完整的设备媒体提供了在系统中存在的任何启动设备上执行操作系统安装、系统维护或系统诊断的能力。
- 可扩展性 - UEFI 驱动模型必须能够扩展到未来定义的总线类型。
- 可移植性 - 根据 UEFI 驱动模型编写的驱动,必须在不同平台和支持的处理器架构之间可移植。
- 可互操作性 - 驱动程序必须与其他驱动程序和系统固件共存,并且必须在不产生资源冲突的情况下进行操作。
- 描述复杂的总线层次结构 - UEFI 驱动模型必须能够描述各种总线拓扑结构,从非常简单的单总线平台到包含许多不同类型总线的非常复杂的平台。
- 驱动占用空间小 - 由 UEFI 驱动程序模型产生的可执行文件的大小必须最小化,以减少整体平台成本。虽然灵活性和可扩展性是目标,但支持这些所需的额外开销必须保持在最低水平,以防止固件组件的大小变得无法管理。
- 解决遗留 Option ROM 的问题 - UEFI 驱动模型必须直接解决遗留 Option ROM 的约束和限制。具体来说,必须能够建立同时支持 UEFI 驱动和传统 Option ROM 的插件卡,这种卡可以在传统 BIOS 系统和符合 UEFI 的平台上执行,而无需修改卡上的代码。该解决方案必须提供一个从传统 Option ROM 驱动程序迁移到 UEFI 驱动程序的进化路径。
遗留 Option ROM 问题
这个支持驱动模型的想法来自于对 UEFI 规范的反馈,它提供了一个明确的、由市场驱动的对传统选项 ROM(有时也被称为扩展 ROM)的替代要求。人们认为,UEFI 规范的出现代表了一个机会,通过用一种在 UEFI 规范框架内工作的替代机制来取代传统选项 ROM 镜像的构建和操作,从而摆脱隐含的限制。
迁移要求
迁移要求涵盖了从最初实施本规范到未来所有平台和操作系统都实施本规范的过渡时期。在这一时期,有两个主要的兼容性考虑是很重要的。
- 能够继续启动传统的操作系统;
- 能够在现有的平台上实现 UEFI,尽可能多地复用现有的固件代码,将开发资源和时间要求降到最低。
旧版操作系统支持
UEFI 规范代表了收缩式操作系统和固件在启动过程中进行通信的首选方式。然而,选择制作一个符合该规范的平台,并不排除该平台,也支持不了解 UEFI 规范的,现有传统操作系统二进制文件。
UEFI 规范并不限制平台设计者,选择同时支持 UEFI 规范和更传统的 “PC-AT “启动基础架构。如果要实现这样的传统基础架构,应该按照现有的行业惯例来开发,这些惯例是在本规范范围之外定义的。在任何给定的平台上,支持的传统操作系统的选项是由该平台的制造商决定的。
在旧平台上支持 UEFI 规范
UEFI 规范经过精心设计,允许以最少的开发工作扩展现有系统以支持它。特别是 UEFI 规范中定义的抽象结构和服务,都可以在遗留平台上得到支持
例如,要在现有且受支持的基于 32 位的平台上实现此类支持,该平台使用传统 BIOS 来支持操作系统启动,需要提供额外的固件代码层。需要这些额外的代码来将服务和设备的现有接口转换为对本规范中定义的抽象的支持。
本文档中使用的约定
数据结构描述
支持的处理器是“小端”机器。这种区别意味着内存中多字节数据项的低位字节位于最低地址,而高位字节位于最高地址。一些受支持的 64 位处理器可以配置为“小端”和“大端”操作。所有旨在符合本规范的实现都使用“小端”操作。
在某些内存布局描述中,某些字段被标记为保留。软件必须将这些字段初始化为零并在读取时忽略它们。在更新操作中,软件必须保留任何保留字段。
协议描述
协议描述一般有以下格式:
- 协议名称:协议接口的正式名称。
- 摘要:协议接口的简要描述。
- GUID:协议接口的 128 位 GUID (Globally Unique Identifier)。
- 协议接口结构:一种“c 风格”的数据结构定义,包含由该协议接口产生的过程和数据字段。
- 参数:协议接口结构中各字段的简要说明。
- 描述:对接口提供的功能的描述,包括调用者应该知道的任何限制和警告。
- 相关定义:协议接口结构或其任何过程中使用的类型声明和常量。
过程描述
过程描述通常具有以下格式:
- 过程名称:过程的正式名称。
- 摘要:过程的简要说明。
- 原型:定义调用序列的“C 风格”过程标头。
- 参数:对程序原型中每个字段的简要描述。
- 描述:对接口所提供的功能的描述,包括调用者应该注意的任何限制和注意事项。
- 相关定义:仅由该过程使用的类型声明和常量。
- 返回的状态代码:对接口所返回的任何代码的描述。该过程需要实现本表中列出的任何状态代码。可以返回更多的错误代码,但是它们不会被标准的符合性测试所测试,而且任何使用该程序的软件,都不能依赖于实现可能提供的任何扩展错误代码。
指令描述
EBC 指令的指令描述一般有以下格式:
- 指令名称:指令的正式名称。
- 语法:指令的简要描述。
- 描述:对指令所提供的功能的描述,并附有指令编码的详细表格。
- 操作:详细说明对操作数进行的操作。
- 行为和限制:逐项描述指令中涉及的每个操作数的行为,以及适用于操作数或指令的任何限制。
伪代码约定
提出伪代码是为了以更简洁的形式描述算法。本文件中的所有算法都不打算直接进行编译。代码是在与周围文本相对应的水平上呈现的。
在描述变量时,列表是一个无序的同质对象的集合。一个队列是一个同质对象的有序列表。除非另有说明,否则假设排序为先进先出。
伪代码以类似于 C 的格式呈现,在适当的地方使用 C 约定。编码风格,特别是缩进风格,是为了可读性,不一定符合 UEFI 规范的实现。
排版约定
本文件采用了以下描述的排版和说明性惯例。
- 纯文本:规范中的绝大部分描述性文本都使用普通文本字体。
- 纯文本(蓝色):任何有下划线和蓝色的纯文本都表示与交叉参考资料的活动链接。点击该词,就可以跟踪超链接。
- 加粗:在文本中,粗体字标识了一个处理器寄存器的名称。在其他情况下,黑体字可以作为段落中的标题。
- 斜体:在文本中,斜体字可以用作强调,以引入一个新的术语或表示手册或规范的名称。
- 加粗等宽(暗红色):计算机代码、示例代码段和所有原型代码段使用 BOLD Monospace 字体,颜色为暗红色。这些代码列表通常出现在一个或多个独立的段落中,尽管单词或片段也可以嵌入到一个正常的文本段落中。
- 加粗等宽(蓝色):用粗体单色字体的字,下划线和蓝色的字,表示该功能或类型定义的代码定义的活动超链接。点击该词,即可进入超链接。
注意:出于管理和文件大小的考虑,每一页上只有第一次出现的参考文献是一个主动链接。同一页上的后续参考文献不会被主动链接到定义上,而是使用标准的、无下划线的 BOLD Monospace 字体。在页面上找到该名称的第一个实例(使用下划线的 BOLD Monospace 字体),点击该词即可跳转到该功能或类型的定义。
- 斜体等宽:在代码或文本中,斜体字表示必须提供的变量信息的占位符名称(即参数)。
数字格式
在本标准中,二进制数字是由仅由西方阿拉伯数字 0 和 1 组成的任何数字序列表示的,后面紧跟一个小写的 b(例如,0101b)。在二进制数字表示中的字符之间可以包含下划线或空格,以增加可读性或划分领域边界(例如,0 0101 1010b 或 0_0101_1010b)。
十六进制
十六进制数字在本标准中用 0x 表示,前面是仅由西阿拉伯数字 0 至 9 和/或大写英文字母 A 至 F 组成的任何数字序列(例如,0xFA23)。十六进制数字表示中的字符之间可以包含下划线或空格,以增加可读性或划定字段边界(例如,0xB FD8C FA23 或 0xB_FD8C_FA23)。
十进制
在本标准中,小数是由仅由阿拉伯数字 0 到 9 组成的任何数字序列来表示的,后面不紧跟小写的 b 或小写的 h(例如,25)。本标准使用以下惯例来表示小数:
- 小数点分隔符(即分隔数字的整数部分和小数部分)是一个句号;
- 千位数分隔符(即分隔数字部分的三位数组)是一个逗号;
- 千位数分隔符用于数字的整数部分,不用于数字的小数部分。
二进制前缀
本标准使用国际单位制(SI)中定义的前缀来表示 10 的幂值。见 “SI 二进制前缀 “标题下的 “UEFI 相关文件链接”(http://uefi.org/uefi)。
本标准使用ISO/IEC 80000-13《数量和单位–第 13 部分:信息科学和技术》和 IEEE 1514《二进制倍数前缀标准》中定义的二进制前缀,用于表示 2 的幂值。
例如,4 KB 意味着 4000 个字节,4 KiB 意味着 4096 个字节。
修订号
对 UEFI 规范的更新被认为是新的修订或勘误表,如下所述:
- 当有实质性的新内容或可能修改现有行为的变化时,就会产生一个新的修订。新的修订版由一个主要的。次要的版本号来指定(例如:xx.yy)。在变化特别小的情况下,我们可能有一个 major.minor.minor 的命名惯例(例如 xx.yy.zz)。
- 当批准的规范更新不包括任何重要的新材料或修改现有行为时,就会产生勘误的版本。勘误的指定方法是在版本号后面加上一个大写字母,如 xx.yy 勘误 A。