UEFI学习1

本文主要翻译wikipedia:https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface

统一可扩展固件接口(UEFI)是定义操作系统和平台固件之间的软件接口的规范。UEFI替换了最初出现在所有IBM pc兼容的个人计算机上的基本输入/输出系统(BIOS)固件接口,大多数UEFI固件实现都为BIOS服务提供了遗留支持。UEFI可以支持远程诊断和修复计算机,即使没有安装操作系统。

UEFI要求固件和操作系统加载程序(或内核)大小匹配;例如,64位UEFI固件实现只能加载64位操作系统(OS)引导加载程序或内核。在系统从“引导服务”转换到“运行时服务”之后,操作系统内核接管。此时,如果内核愿意,它可以改变处理器模式,但是这会限制运行时服务的使用(除非内核再次切换回来)。在3.15版本中,Linux内核支持64位内核在运行在x86-64 cpu上的32位UEFI固件实现上启动,UEFI从UEFI引导加载程序切换支持是必需的。UEFI切换协议删除了内核和UEFI引导加载程序之间的UEFI初始化代码,使初始化只由Linux内核的UEFI引导存根.

 

 1、EFI在软件栈中的位置(EFI's position in the software stack)

如上图所示,UEFI介于硬件与操作系统之间。

2、UEFI提供的服务(service)

EFI定义了两种类型的服务:引导服务和运行时服务。只有当固件拥有平台(即它们包括各种设备上的文本和图形控制台,以及总线、块和文件服务。运行时服务仍然可以在操作系统运行时访问;它们包括日期、时间和NVRAM访问等服务。

此外,图形输出协议(GOP)提供有限的运行时服务支持;请参阅下面的图形特性部分。允许操作系统在运行时模式下直接写入GOP提供的framebuffer。然而,在转换到运行时服务模式后,直到加载操作系统图形驱动程序之前,更改视频模式的能力将丢失。

变量服务(Variable services)

UEFI变量提供了一种存储数据的方法,特别是在平台固件和操作系统或UEFI应用程序之间共享的非易失性数据。变量名称空间由GUIDs标识,变量是键/值对。例如,变量可用于在NVRAM中保存崩溃消息,以便操作系统在重启后检索。

时间服务(Time services)

UEFI提供设备独立的时间服务。时间服务包括对时区和夏令时字段的支持,这些字段允许将硬件实时时钟设置为本地时间或UTC。在使用PC-AT - real-time时钟的机器上,默认情况下,硬件时钟仍然必须设置为本地时间,以便与基于bios的Windows兼容,除非使用最新版本,并且在Windows注册表中设置一个条目以指示UTC的使用。

3、应用(Applications)

除了装载操作系统,UEFI还可以运行UEFI应用程序,这些应用程序作为文件驻留在EFI系统分区上。它们可以通过UEFI命令shell、固件的引导管理器或其他UEFI应用程序执行。UEFI应用程序可以独立于系统制造商开发和安装。

UEFI应用程序的一种类型是操作系统加载器,如GRUB、rEFInd、Gummiboot和Windows Boot Manager;它将操作系统文件加载到内存中并执行它。另外,操作系统加载程序可以提供用户界面,允许选择另一个UEFI应用程序运行。像UEFI shell这样的实用程序也是UEFI应用程序。

 

4、协议(Protocols)

EFI将协议定义为用于两个二进制模块之间通信的一组软件接口。所有EFI驱动程序都必须通过协议向其他人提供服务。

5、设备驱动程序(Device drivers)

除了标准的特定于处理器体系结构的设备驱动程序之外,EFI还提供了存储在内存中的独立于处理器的设备驱动程序,它们被存储为EFI字节码或EBC。系统固件为EBC映像提供了解释器。从这个意义上说,EBC类似于Open Firmware,即基于powerpc的苹果Macintosh和Sun Microsystems SPARC等计算机中使用的与硬件无关的固件。

某些设备类型的特定于体系结构的(非EFI字节码)EFI驱动程序可以有供操作系统使用的接口。这使得操作系统能够依赖于EFI驱动程序在加载操作系统特定驱动程序之前执行基本的图形和网络功能。

6、图形特征(Graphics features)

EFI规范定义了一个UGA(通用图形适配器)协议,作为一种支持独立于设备的图形的方式。UEFI没有包含UGA,而是用GOP(图形输出协议)代替了它,明确的目标是消除VGA硬件的依赖性。两者相似。

UEFI 2.1定义了一个“人工接口基础结构”(HII)来管理用户输入、本地化字符串、字体和表单(在HTML意义上)。这使原始设备制造商(oem)或独立BIOS供应商(IBVs)能够为预引导配置设计图形界面;UEFI本身并不定义用户界面。

大多数早期UEFI固件实现都是基于控制台的,但早在2007年,一些实现就以图形用户界面为特色。

7、EFI系统分区(EFI System partition)

EFI系统分区,通常缩写为ESP,是一个数据存储设备分区,在遵循UEFI规范的计算机中使用。当计算机启动时,UEFI固件可以访问它,它存储UEFI应用程序和这些应用程序需要运行的文件,包括操作系统内核。支持的分区表方案包括MBR和GPT,以及光盘上的El Torito卷。UEFI定义了一个特定的文件系统版本,这是维护的一部分UEFI规范和独立于原来的规范,包括对esp FAT32文件系统的一个变体,和FAT16 FAT12文件系统。ESP还为引导扇区提供了空间,作为向BIOS兼容的一部分

 

 

UEFI学习2:https://blog.youkuaiyun.com/qq_28629687/article/details/81289609

 

 

 

### 3.1 学习路径与核心知识体系 UEFI(Unified Extensible Firmware Interface)作为现代固件接口规范,其学习路径应从基础概念、体系结构、驱动模型、系统启动流程逐步深入,最终结合实践进行系统化掌握。以下为推荐的学习路径: - **第一阶段:基础概念与架构理解** 需掌握 UEFI 的基本概念,包括启动流程、内存管理、协议驱动模型、设备路径(DevicePath)机制、安全启动(Secure Boot)等。可参考 UEFI 规范文档,尤其是 UEFI Driver Model 的设计目标,如兼容性、可扩展性、可移植性等[^1]。 - **第二阶段:编程与接口规范** 深入学习 UEFI 编程接口,包括 EFI_BOOT_SERVICES、EFI_RUNTIME_SERVICES、EFI_HANDLE、EFI_GUID 等核心数据结构。了解如何使用 UEFI 提供的协议(Protocol)如 `gEfiDiskIoProtocolGuid`、`gEfiSimpleTextOutProtocolGuid` 等[^1]。 - **第三阶段:固件开发与调试环境搭建** 掌握 EDK II(UEFI Development Kit)的使用方法,包括构建 UEFI 镜像、编写 UEFI 应用程序、加载驱动、调试 Boot Services 与 Runtime Services 等功能。学习如何在 QEMU 或物理设备上运行和调试 UEFI 代码。 - **第四阶段:安全机制与高级特性** 理解 Secure Boot、TPM、Measured Boot、可信计算等安全机制的实现原理。掌握如何在 UEFI 层面实现系统完整性验证和启动过程的安全防护。 - **第五阶段:跨平台移植与兼容性处理** 学习如何将 UEFI 驱动程序移植到不同平台(如 ARM、x86)、如何处理遗留 Option ROM 的兼容性问题,以及如何实现 UEFI 驱动与传统 BIOS 系统的共存[^1]。 ### 3.2 推荐资料与学习资源 - **官方文档与规范** - *UEFI Specification 2.10*:最权威的参考文档,涵盖 UEFI 的所有核心接口和规范,是学习 UEFI 驱动模型和启动流程的基础。 - *PI Specification*(Platform Initialization Specification):详细描述 UEFI 启动流程的各个阶段(SEC、PEI、DXE、BDS 等),适合深入理解固件启动机制。 - *UEFI Driver Model*:讲解驱动程序如何与 UEFI 协议交互,如何实现模块化、可扩展的驱动设计。 - **书籍与教程** - 《UEFI 原理与编程》:系统介绍 UEFI 编程模型、设备路径、启动流程和驱动开发实践。 - 《UEFI 内核导读》:适合有一定操作系统开发基础的读者,深入讲解 UEFI 固件的内部机制。 - 《UEFI EDK II 编程实战》:以 EDK II 工具链为基础,讲解如何构建 UEFI 镜像、开发 UEFI 应用程序和驱动。 - **开源项目与社区资源** - TianoCore EDK II:开源 UEFI 开发工具包,提供完整的 UEFI 实现,适合学习和开发。 - QEMU + OVMF:用于在虚拟环境中运行 UEFI 固件,便于调试和测试。 - GitHub 上的 UEFI 示例项目:如简单的 UEFI Shell 应用、驱动程序示例等。 ### 3.3 实践方法与开发环境搭建 - **搭建开发环境** 使用 TianoCore EDK II 构建 UEFI 固件镜像,配置编译环境(Windows 下可使用 Visual Studio,Linux 下使用 GCC)。学习如何编写 UEFI 应用程序并将其打包进固件镜像中。 - **编写 UEFI 应用程序** 从简单的“Hello World”开始,使用 UEFI 提供的 `gST->ConOut->OutputString` 接口输出文本,逐步学习如何访问文件系统、磁盘设备、网络接口等资源。 ```c #include <Uefi.h> #include <Library/UefiLib.h> #include <Library/ShellCEntryLib.h> EFI_STATUS EFIAPI UefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { Print (L"Hello, UEFI World!\n"); return EFI_SUCCESS; } ``` - **设备路径操作与调试** 使用 `gEfiDevicePathToTextProtocolGuid` 将设备路径转换为字符串,以便调试设备识别逻辑[^2]。 ```c EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevicePathToText; Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (void**)&DevicePathToText); if (!EFI_ERROR(Status)) { CHAR16 *TextDevicePath = DevicePathToText->ConvertDevicePathToText(DevicePath, FALSE, FALSE); Print(L"Device Path: %s\n", TextDevicePath); } ``` - **驱动开发与加载** 编写 UEFI 驱动程序,注册驱动入口点,安装协议,处理设备枚举与资源分配。测试驱动在不同平台上的行为,确保其兼容性和可移植性。 - **安全启动与签名验证** 学习如何配置 Secure Boot 策略,使用 `gEfiSecurityProtocolGuid` 实现签名验证机制,确保只有合法的 UEFI 应用程序或操作系统加载器能够执行。 - **使用 UEFI Shell 调试** 在 UEFI Shell 中运行和调试 UEFI 应用程序,使用命令如 `load`, `devtree`, `dpath` 等分析设备路径和驱动加载状态。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值