多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

EDK II EmulatorPkg 平台 CI 构建指南:基于 Pytools 的本地构建与模拟器自动化运行

EDK II EmulatorPkg 平台 CI 构建指南:基于 Pytools 的本地构建与模拟器自动化运行 固件操作系统驱动开发嵌入式【免费下载链接】edk2EDK II项目地址https://gitcode.com/gh_mirrors/ed/edk2点击查看免费下载本篇技术指南以 EDK II 仓库中 EmulatorPkg/PlatformCI/ReadMe.md 为核心系统讲解 EmulatorPkg 的 Azure DevOps 平台 CI 架构以及如何复用同一套 Pytools 构建基础设施在本地完成固件编译、模拟器启动与自动化 Shell 脚本执行。读完本文你将掌握从零搭建 EDK II Python 虚拟环境、执行stuart_setup/stuart_update/stuart_build全流程、通过BLD_*_前缀传递构建开关如 Secure Boot、IP6 网络栈以及利用--FlashOnly与startup.nsh实现无人工介入的 CI 式回归验证的完整实战方案。EmulatorPkg 与平台 CI 概述EmulatorPkg 是 EDK II 中的一个 UEFI/PI 仿真平台在无法运行真实 UEFI 固件的环境中例如以操作系统进程宿主 UEFI 仿真环境的场景它可以提供一个完整的 UEFI 环境用于模块调试与平台原型验证同时也是一个 DSC 文件编写范本。相关背景可参阅 EmulatorPkg/Readme.md。EmulatorPkg/PlatformCI/目录下仅有两个文件构成了整个平台 CI 的核心ReadMe.md描述基于 Azure DevOps 的 Platform CI 用法及本地复用的方法本文讲解对象PlatformBuild.pyPytools 构建入口脚本定义了构建配置、命令行参数、环境变量与模拟器启动逻辑。这套基础设施的独特之处在于edksetup、子模块初始化以及 NASM、iASL、交叉编译工具链的手动安装均不需要全部由 Pytools 构建系统接管。你只需一个 Python 环境与系统编译器即可获得与 CI 完全一致的构建行为。支持的构建配置官方验证过的构建/运行环境组合为Windows 10 VS2026与Ubuntu 18.04 GCC 工具链。在此基础上支持四种固件构建见原文档配置表配置名称架构DSC 文件附加标志IA32IA32EmulatorPkg.dsc无X64X64EmulatorPkg.dsc无IA32 FullIA32EmulatorPkg.dscSECURE_BOOT_ENABLETRUEX64 FullX64EmulatorPkg.dscSECURE_BOOT_ENABLETRUE从 PlatformBuild.py 的CommonPlatform类可以看到与 CI 一致的硬编码约束PackagesSupported (EmulatorPkg,)本平台构建只涉及 EmulatorPkg 一个包ArchSupported (X64, IA32)仅支持 X64 与 IA32 两种架构TargetsSupported (DEBUG, RELEASE, NOOPT)与 EmulatorPkg.dsc 中BUILD_TARGETS DEBUG|RELEASE|NOOPT一致Scopes (emulatorpkg, edk2-build)Pytools 的活动 Scope 标识。所有配置共用 EmulatorPkg/EmulatorPkg.dsc区别仅在SECURE_BOOT_ENABLE标志。该 DSC 还默认定义了一批可裁剪的功能开关NETWORK_SNP_ENABLE、NETWORK_IP6_ENABLE、NETWORK_TLS_ENABLE、NETWORK_HTTP_BOOT_ENABLE、NETWORK_HTTP_ENABLE、NETWORK_ISCSI_ENABLE及REDFISH_ENABLE默认均为FALSE见 EmulatorPkg.dsc。开启 Secure Boot 后构建系统会额外引入SecurityPkg的 AuthVariableLib、SecureBootVariableLib、DxeImageVerificationLib 等模块并将PcdMaxAuthVariableSize提升至0x2800见 EmulatorPkg.dsc 与 EmulatorPkg.dsc。EDK2 开发者环境准备原文档列出的前置依赖如下GIT用于拉取源码与子模块EDK2 源码即当前仓库本身构建 Basetools 及宿主应用程序所需的系统包Ubuntu/Debian 系sudo apt-get update sudo apt-get install gcc g make uuid-dev在 X64 的 Ubuntu 18.04 LTS 上构建 IA32 架构时还需启用 i386 多架构支持并安装 32 位开发库sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install libc6-dev:i386 libx11-dev:i386 libxext-dev:i386 lib32gcc-7-dev注意edksetup、子模块初始化、NASM、iASL 或交叉编译工具链的手动安装均不需要——Pytools 构建系统会自动完成这些工作。从源码看环境依赖如何被接管PlatformBuild.py 的GetRequiredSubmodules()展示了子模块依赖的自动发现机制显式声明CryptoPkg/Library/OpensslLib/openssl之后脚本会通过git config --file .gitmodules --get-regexp path解析.gitmodules中全部子模块路径并逐条加入依赖列表从而避免人工维护每个新增子模块。这正是stuart_setup可以一站式完成子模块初始化的原因。系统包gcc/g/make/uuid-dev仅用于构建 Basetools 和模拟器宿主程序如 Linux 下的HostNASM/iASL 等固件侧工具则由 Pytools 通过 ext_dep 声明自动拉取。使用 Pytools 构建 EmulatorPkgPytools 指 EDK II 官方的 Python 构建工具集edk2-pytool-extensions与edk2-pytool-library其版本由仓库根目录的 pip-requirements.txt 锁定当前为edk2-pytool-extensions~0.31.1、edk2-pytool-library~0.23.16。以下步骤完全继承原文档并补充参数说明。第 1 步创建 Python 虚拟环境可选建议每个工作区一次python -m venv name of virtual environment例如python -m venv .venv。第 2 步激活虚拟环境每次打开新 shell 时执行Linuxsource name of virtual environment/bin/activateWindowsname of virtual environment/Scripts/activate.bat第 3 步安装 Pytools每次虚拟环境新建或 pip-requirements.txt 变更时pip install --upgrade -r pip-requirements.txt该命令安装stuart_setup、stuart_update、stuart_build等 stuart 系列命令。第 4 步初始化并更新子模块仅在子模块更新时stuart_setup -c EmulatorPkg/PlatformCI/PlatformBuild.py TOOL_CHAIN_TAGTOOL_CHAIN_TAG -a TARGET_ARCH-c指定平台配置文件即 PlatformBuild.pyTOOL_CHAIN_TAG按平台选择例如 Windows 用VS2026Linux 用GCC-a指定目标架构X64或IA32。第 5 步初始化并更新依赖仅在 ext_dep 变更时stuart_update -c EmulatorPkg/PlatformCI/PlatformBuild.py TOOL_CHAIN_TAGTOOL_CHAIN_TAG -a TARGET_ARCH此步骤负责拉取 NASM、iASL 等外部依赖ext_dep。第 6 步按需编译 Basetools仅在 Basetools C 源码变更时python BaseTools/Edk2ToolsBuild.py -t ToolChainTag第 7 步编译固件stuart_build -c EmulatorPkg/PlatformCI/PlatformBuild.py TOOL_CHAIN_TAGTOOL_CHAIN_TAG -a TARGET_ARCH使用stuart_build -c EmulatorPkg/PlatformCI/PlatformBuild.py -h可查看附加选项例如--clean清理后重建。第 8 步运行模拟器两种方式在构建命令末尾追加--FlashRom构建完成后自动启动模拟器使用--FlashOnly仅启动模拟器不重新构建。stuart_build -c EmulatorPkg/PlatformCI/PlatformBuild.py TOOL_CHAIN_TAGTOOL_CHAIN_TAG -a TARGET_ARCH --FlashOnly注意事项无需配置Conf/target.txt。ACTIVE_PLATFORM与TARGET_ARCH由 PlatformBuild.py 依据[-a TARGET_ARCH]参数自动设置。这一点在源码中得到印证PlatformBuild.py 的RetrieveCommandLineOptions()会将命令行传入的架构写入构建变量TARGET_ARCH并把ACTIVE_PLATFORM固定为EmulatorPkg/EmulatorPkg.dscPlatformBuild.py 的SetArchitectures()还会校验请求架构是否在支持列表内否则抛出异常并打印Unsupported Architecture Requested。执行日志会同时输出到 stuart 日志文件与控制台。默认工具链标签为VS2026见 PlatformBuild.py日志级别为DEBUG见 PlatformBuild.py。在 Windows 宿主上构建脚本还会检测CLANG_BIN环境变量若其中存在mingw32-make.exe则设置WIN_MINGW32_BUILDTRUE以支持 MinGW 环境下的 Windows 应用构建见 PlatformBuild.py。模拟器启动的底层机制--FlashRom与--FlashOnly最终都调用 PlatformBuild.py 的FlashRomImage()方法。其逻辑为计算输出目录BUILD_OUTPUT_BASE/TARGET_ARCH若设置了MAKE_STARTUP_NSHTRUE先在该目录写入startup.nsh文件按宿主系统选择可执行文件Windows 运行WinHost.exeLinux 运行./Host其他宿主直接报Unsupported Host并返回 -1在该输出目录中以工作目录方式启动模拟器进程。输出目录路径与模拟器可执行文件的对应关系也可以参考 EmulatorPkg/Readme.md 中传统build命令的说明例如 Linux 下产物位于Build/EmulatorX64/DEBUG_GCC/X64/启动命令为./Host。自定义构建选项MAKE_STARTUP_NSHTRUE会在映射为fs0的位置输出一个startup.nsh文件。该选项在 CI 中与--FlashOnly配合使用先让模拟器启动到 UEFI Shell再自动执行startup.nsh中的内容从而实现无人值守的自动化验证。从源码看当该选项开启时FlashRomImage() 会向startup.nsh写入BOOT SUCCESS !!! reset即启动后打印成功标志并执行reset重启退出。实际 CI 场景中可在此追加任意 Shell 命令如fs0:\test.efi来驱动被测模块。同时 GetName() 会在该选项开启时把日志文件命名为EmulatorPkg_With_Run避免模拟器运行阶段覆盖构建日志——这也是 CI 中防止日志互相覆盖的关键设计。传递构建宏定义Build Defines要通过stuart_build向 DSC 传递宏定义规则是在宏名之前加BLD_*_前缀并直接放到命令行。由于stuart_build目前要求宏必须赋值裸宏需要追加1后缀。例如启用 IP6 网络栈stuart_build -c EmulatorPkg/PlatformCI/PlatformBuild.py BLD_*_NETWORK_IP6_ENABLE1此处NETWORK_IP6_ENABLE对应 EmulatorPkg.dsc 中默认值为FALSE的宏BLD_*_前缀会被 stuart 剥离后注入构建环境。同理也可用BLD_*_SECURE_BOOT_ENABLE1实现IA32 Full/X64 Full配置或用BLD_*_NETWORK_SNP_ENABLE1、BLD_*_NETWORK_TLS_ENABLE1、BLD_*_NETWORK_HTTP_BOOT_ENABLE1、BLD_*_NETWORK_HTTP_ENABLE1、BLD_*_NETWORK_ISCSI_ENABLE1、BLD_*_REDFISH_ENABLE1分别裁剪网络与 Redfish 功能。需要留意的是开启SECURE_BOOT_ENABLE或NETWORK_ENABLE后DSC 才会引入 CryptoPkg 相关 PCD 与模块否则引用未启用功能的 CryptoPkg PCD 会触发构建错误见 EmulatorPkg.dsc 中的注释与条件包含逻辑。平台与工具链兼容性矩阵虽然 CI 官方验证组合是 Windows 10 VS2026 与 Ubuntu 18.04 GCC但 EmulatorPkg.dsc 中内嵌的兼容性矩阵给出了更完整的支持范围OS/编译器VS2019/VS2022/VS2026CLANGPDBCLANGDWARFGCC/GCCNOLTOXCODE5Windows/VSIA32/X64Windows/LLVM/VSIA32/X64Windows/LLVM/MSYS2X64Windows/LLVM/MINGWIA32/X64Linux/LLVMIA32/X64Linux/GCCIA32/X64macOS/XCODE5IA32/X64该矩阵同时通过!if/!error指令在编译期强制校验组合合法性例如 Linux 上使用 VS20xx 或 CLANGPDB、Windows 上使用 GCC 都会直接报错终止见 EmulatorPkg.dsc。文中配置命令中的TOOL_CHAIN_TAG与-a参数应依据这张矩阵选择匹配的工具链与架构。小结与参考通过EmulatorPkg/PlatformCI/这套基于 Pytools 的构建基础设施开发者可以在本地获得与 Azure DevOps Platform CI 完全一致的构建、运行与自动化验证体验无需手动维护target.txt与工具链安装一条stuart_build命令即可完成编译--FlashOnlyMAKE_STARTUP_NSH组合则可直接驱动模拟器进入 UEFI Shell 执行startup.nsh脚本非常适合作为模块级回归测试与 CI 镜像复现的入口。进一步深入可阅读EmulatorPkg/PlatformCI/PlatformBuild.py构建脚本完整实现架构校验、子模块自动发现、Flash 逻辑EmulatorPkg/PlatformCI/ReadMe.md平台 CI 官方说明原文EmulatorPkg/EmulatorPkg.dsc平台 DSC 与全部功能开关定义EmulatorPkg/Readme.md传统build命令方式构建与运行模拟器的对照说明pip-requirements.txtPytools 及相关 Python 依赖版本锁定文件。赞分享固件操作系统驱动开发嵌入式【免费下载链接】edk2EDK II项目地址https://gitcode.com/gh_mirrors/ed/edk2点击查看免费下载相关推荐EDK II EmulatorPkg使用教程在Windows/Linux上构建UEFI模拟器EDK II EmulatorPkg使用教程在Windows/Linux上构建UEFI模拟器 引言告别硬件依赖轻松进入UEFI开发 你是否还在为UEFI开固件操作系统驱动开发嵌入式Cloud Hypervisor UEFI 启动实战基于 EDK II 构建与加载 OVMF 固件CLOUDHV.fdCloud Hypervisor UEFI 启动实战基于 EDK II 构建与加载 OVMF 固件CLOUDHV.fd Cloud HypervisorAgent 沙箱虚拟化云原生人工智能后端容器运行时使用 CoreRun 与 Core_Root 运行基于本地构建的 .NET 运行时使用 CoreRun 与 Core_Root 运行基于本地构建的 .NET 运行时 导读 本文面向正在为 .NET 运行时仓库runtime repo贡献代语言运行时标准库JIT编译编译器上一篇Trino多租户资源隔离终极指南配置与监控实践下一篇Omi开源AI助手终极指南打造你的第二大脑让AI真正为你工作创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表