# UEFI开发学习实例 **Repository Path**: ay123net/uefistudy ## Basic Information - **Project Name**: UEFI开发学习实例 - **Description**: 存放UEFI开发实例代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 6 - **Created**: 2021-07-05 - **Last Updated**: 2025-09-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: UEFI ## README # uefistudy - UEFI 开发学习项目 ## 项目概述 这是一个 UEFI (Unified Extensible Firmware Interface) 开发学习项目,旨在通过一系列实践模块帮助开发者理解和掌握 UEFI 编程基础。项目包含多个独立的学习示例,覆盖字体显示、数据结构实现、图形控制台、中文支持、设备路径处理、截图功能、PEIM 模块开发、EFI 应用运行、固件资源获取、Secure Boot 密钥生成、磁盘信息获取以及 HII (Human Interface Infrastructure) 基础等主题。 每个模块都是一个小型 UEFI 驱动或应用,基于 EDK II (EFI Development Kit II) 框架实现。项目适合 UEFI 初学者,用于实验和学习 UEFI 规范的核心概念,如驱动模型、协议、事件处理和固件交互。 项目结构采用模块化设计,每个学习主题对应一个子目录,包含源代码 (.c 文件)、模块描述文件 (.inf)、资源文件 (.bin, .otf 等) 和脚本 (.bat, .nsh)。 ## 学习模块列表 项目包含以下 UEFI 开发学习模块,每个模块聚焦特定主题,提供代码实现和相关资源: - **UEFI开发学习10 - 中文的显示** 焦点:实现中文字体显示基础。 关键文件:`Font/Font.c`、`Font/Font.inf`、`Font/FontLib.c`。 描述:探索 UEFI 中字体加载和渲染机制,支持基本中文字符显示。 - **UEFI开发学习11 - 使用双向链表** 焦点:数据结构在 UEFI 中的应用。 关键文件:`List/List.c`、`List/List.inf`。 描述:实现双向链表,用于 UEFI 内存管理和节点操作。 - **UEFI开发学习12 - 中文显示(中)** 焦点:高级中文图形显示和 Shell 支持。 关键文件:`GraphicsConsoleDxe/GraphicsConsole.c`、`ShellFont/ShellFont.c`、`NotoSansSC-Medium.otf`、`常用汉字列表.txt`。 描述:扩展图形控制台 (GraphicsConsoleDxe) 支持中文字体渲染,并为 Shell 添加字体模块。 - **UEFI开发学习15 - Device Path** 焦点:UEFI 设备路径处理。 关键文件:`DevPath/DevPath.c`、`DevPath/DevPath.inf`。 描述:演示设备路径 (Device Path) 的解析和构建,用于设备识别和协议定位。 - **UEFI开发学习16 - 为UEFI固件加一个截图功能** 焦点:固件级截图捕获。 关键文件:`ScreenshotDriver.c`、`ScreenshotDriver.inf`、`ScreenshotDriver.h`。 描述:开发一个 UEFI 驱动,用于捕获屏幕截图并保存,支持固件调试。 - **UEFI开发学习17 - UEFI开发学习18 – 写一个PEIM** 焦点:PEIM (PEI Module) 开发。 关键文件:`CmosManagerPei.c`、`CmosManagerPei.inf`。 描述:实现 PEI 阶段模块,管理 CMOS (Complementary Metal-Oxide-Semiconductor) 配置。 - **UEFI开发学习21 - 运行EFI APP** 焦点:EFI 应用启动。 关键文件:`StartEfi/StartEfi.c`、`StartEfi/StartEfi.inf`。 描述:创建启动 EFI 应用的驱动,支持运行独立 EFI 可执行文件。 - **UEFI开发学习22 - 退出码** 焦点:EFI 应用退出处理。 关键文件:`HelloWorld/HelloWorld.c`、`StartEfi/StartEfi.c`、`Test.nsh`。 描述:示例 HelloWorld 应用和启动器,演示退出码 (Exit Code) 的返回和处理。 - **UEFI开发学习26 – 获取固件中的资源** 焦点:固件卷 (Firmware Volume) 资源提取。 关键文件:`FirmwareVolume/FirmwareVolume.c`、`Test1.bin`、`Test2.bin`。 描述:从固件卷中读取嵌入资源,如二进制数据文件。 - **UEFI开发学习27 – Secure Boot Key 的生成及签名** 焦点:Secure Boot 密钥管理和签名。 关键文件:`SbkTool/buildcert.bat`、`signefi.bat`、`tools/openssl/openssl.exe`、`tools/signtool/signtool.exe`。 描述:提供工具脚本生成 Secure Boot 密钥、证书,并对 EFI 文件进行签名。 - **UEFI开发学习28 – 获取磁盘信息** 焦点:磁盘设备信息查询。 关键文件:`DiskInfo/DiskInfo.c`、`DiskInfo/DiskInfo.inf`。 描述:使用 Block I/O 协议获取磁盘几何信息和分区细节。 - **UEFI开发学习31 - HII基础与编程** 焦点:HII 用户界面基础。 关键文件:`HiiDemo/HiiDemo.c`、`HiiDemoVfr.vfr`、`HiiDemo.uni`。 描述:实现 HII 演示模块,支持字符串、表单和 VFR (Visual Form Representation) 配置。 ## 构建环境要求 要构建和运行这些模块,需要设置 UEFI 开发环境。推荐使用 EDK II 框架。 ### 必要工具和依赖 - **EDK II**:下载并克隆 TianoCore EDK2 仓库(https://github.com/tianocore/edk2)。版本建议:2023 或更高。 - **工具链**: - GCC (推荐用于 Linux/Windows):版本 7.4 或更高。 - Visual Studio (Windows):2019 或更高,包括 C++ 构建工具。 - NASM:用于汇编代码,版本 2.14 或更高。 - **其他依赖**: - Python 3.x:用于 EDK II 脚本。 - BaseTools:EDK II 自带构建工具。 - OpenSSL:用于 Secure Boot 模块(项目中已包含工具)。 - **操作系统**:Windows 10/11 或 Linux (Ubuntu 20.04+)。 ### 环境设置步骤 1. 克隆 EDK2: ``` git clone https://github.com/tianocore/edk2.git cd edk2 git submodule update --init ``` 2. 设置环境: - Windows:运行 `edksetup.bat`(使用 VS 工具链)或 `edksetup Rebuild`。 - Linux:运行 `source edksetup.sh` 并设置 `GCC5_*_CC` 变量。 3. 将本项目模块集成到 EDK2 的 `MdeModulePkg` 或自定义包中(编辑 .dsc 文件添加 INF)。 ## 构建和运行指南 ### 构建模块 1. 在 EDK2 根目录下,编辑包描述文件 (.dsc),添加模块的 INF 文件路径,例如: ``` [Components] YourPkg/UEFI开发学习10 - 中文的显示/Font/Font.inf ``` 2. 运行构建命令: ``` build -p YourPkg/YourPkg.dsc -a X64 -t GCC5 -b DEBUG ``` - `-p`:平台描述文件。 - `-a`:架构 (IA32/X64)。 - `-t`:工具链 (GCC5/VS2019)。 - `-b`:构建类型 (DEBUG/RELEASE)。 输出将生成 .efi 文件在 `Build/YourPkg/DEBUG_GCC5/X64/` 目录。 ### 运行模块 1. **使用 QEMU 模拟**(推荐用于测试): - 下载 OVMF (OVMF.fd):EDK2 的 UEFI 固件镜像。 - 运行命令: ``` qemu-system-x86_64 -bios OVMF.fd -drive file=fat:rw:.,format=raw -net none ``` - 将生成的 .efi 文件复制到 FAT 磁盘镜像中。 - 在 UEFI Shell 中加载:`fs0:> load YourModule.efi`。 - 对于 Secure Boot 模块:使用签名的固件并配置 db/dbx 变量。 2. **在真实硬件上运行**: - 将 .efi 文件加载到 UEFI Shell 或使用 EFI Boot Manager。 - 对于驱动模块,确保在 UEFI 引导阶段加载。 3. **特定模块运行示例**: - 中文显示模块:构建 GraphicsConsoleDxe.efi 并替换标准控制台。 - Secure Boot 工具:运行 `signefi.bat YourFile.efi` 生成签名文件。 - HII 模块:加载 HiiDemo.efi 以查看表单界面。 ## 贡献和联系 欢迎贡献新模块或修复 bug。请 fork 项目并提交 Pull Request。 作者: bin https://ay123.net 许可证:BSD --- 最后更新:2025-09-21