UEFI学习3

本文介绍了UEFI的主要功能,包括网络启动,通过PXE和其他协议实现远程操作系统映像的加载;安全启动,确保只有经过验证的软件才能在系统上运行;UEFI shell,提供命令行界面用于执行UEFI应用和服务;以及UEFI扩展,允许OEM添加更多功能。

UEFI的官网为:https://www.uefi.org/

1、网路启动(Network booting)

UEFI规范包含通过预引导执行环境(PXE)通过网络引导的支持。PXE启动使用的网络协议包括Internet协议(IPv4和IPv6)、用户数据报协议(UDP)、动态主机配置协议(DHCP)和普通文件传输协议(TFTP)

OS映像可以远程存储在存储区域网络(san)上,通过Internet小型计算机系统接口(iSCSI)和光纤通道(FCoE)作为支持的协议来访问san .

UEFI规范的2.5版增加了对通过HTTP协议访问引导映像的支持

2、安全启动(Secure boot)

UEFI 2.3.1勘误表C规范(或更高版本)定义了一种称为安全引导的协议,它可以通过防止加载没有可接受数字签名的驱动程序或操作系统加载程序来保护引导过程。没有详细说明这些驱动程序的具体签名方式。在启用安全引导时,它首先被放置在“setup”模式中,允许将名为“Platform key”(PK)的公钥写入固件。编写完密钥后,安全引导进入“用户”模式,固件只能加载与平台密钥签名的驱动程序和加载程序。可以将额外的“密钥交换密钥”(KEK)添加到存储在内存中的数据库中,以允许使用其他证书,但它们必须仍然与平台密钥的私有部分有连接。安全引导也可以放在“自定义”模式下,在这种模式下,可以向与私钥不匹配的系统添加额外的公钥。

安全引导支持Windows 8和8.1、Windows Server 2012和2012 R2、Windows 10、VMware vSphere 6.5[51]和许多Linux发行版,包括Fedora(版本18)、openSUSE(版本12.3)、RHEL(版本7)、CentOS(版本7[52])和Ubuntu(版本12.04.2)。截至2017年1月,FreeBSD支持正处于规划阶段。

3、UEFI shell

UEFI提供了一个shell环境,可以用来执行其他UEFI应用程序,包括UEFI引导加载程序。除此之外,UEFI shell中可用的命令可以用于获取关于系统或固件的各种其他信息,包括获取内存映射(memmap)、修改引导管理器变量(bcfg)、运行分区程序(diskpart)、加载UEFI驱动程序和编辑文本文件(edit)

UEFI外壳的源代码可以从英特尔的TianoCore UDK2010 / EDK2 SourceForge项目下载。[58] Shell v2在UEFI 2.3+系统中工作得最好。Shell v1应该可以在所有UEFI系统中工作

UEFI shell的启动方法取决于系统主板的制造商和型号。其中一些已经在固件设置中提供了直接的启动选项,例如编译后的x86-64版本的shell需要以<EFI_SYSTEM_PARTITION>/SHELLX64.EFI的形式提供。其他一些系统已经嵌入了UEFI外壳,可以通过适当的按键组合来启动。对于其他系统,解决方案是要么创建一个合适的USB闪存驱动器,要么手动添加一个与shell编译版本相关联的引导选项(bcfg)。

4、扩展(Extensions)

实际上,EFI的扩展可以从连接到计算机的任何非易失性存储设备加载。例如,原始设备制造商(OEM)可以在硬盘驱动器上分发带有EFI分区的系统,这将为存储在主板ROM上的标准EFI固件添加额外的功能

### 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、付费专栏及课程。

余额充值