ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

EDK II LoongArch 虚拟化实践:基于 OvmfPkg/LoongArchVirt 的 QEMU virt 平台固件构建、Secure Boot 与运行验证

EDK II LoongArch 虚拟化实践:基于 OvmfPkg/LoongArchVirt 的 QEMU virt 平台固件构建、Secure Boot 与运行验证 固件操作系统驱动开发嵌入式【免费下载链接】edk2EDK II项目地址https://gitcode.com/gh_mirrors/ed/edk2点击查看免费下载导读本文围绕 EDK II 仓库中OvmfPkg/LoongArchVirt平台包展开系统讲解如何在 x86 Linux 主机上为 LoongArch64龙芯架构QEMU virt 虚拟平台交叉编译 UEFI 固件并以qemu-system-loongarch64完成固件级与操作系统级的两级运行验证。读完本文你将掌握从交叉工具链配置、固件构建、Secure Boot 锁定策略到 QEMU 启动参数调优的完整实战链路并理解该平台在 SEC/PEI/DXE 各阶段与内存布局上的实现细节。平台概述无需真实硬件的通用 LoongArch 虚拟平台LoongArch QEMU virt 是 EDK II 中面向龙芯架构的通用虚拟平台generic platform其设计目标是不依赖任何真实硬件即可完成固件开发、调试与验证。该平台的核心定位如下面向 LOONGARCH64 架构SUPPORTED_ARCHITECTURES LOONGARCH64见 LoongArchVirtQemu.dsc。通过 QEMUvirt机型模拟配合 FDTFlattened Device Tree发现外设。最低版本要求QEMU 8.1、GCC 13、Binutils 2.40。三者共同决定了交叉编译与模拟运行的前置门槛低于该版本将无法保证固件正确构建与启动。从仓库的 LoongArchVirtQemu.dsc 可以看出该平台包采用与 OvmfPkg 其他 virt 平台一致的模块化组织方式PLATFORM_NAME LoongArchVirtQemu输出目录为Build/$(PLATFORM_NAME)Flash 描述文件为同目录下的LoongArchVirtQemu.fdf。其默认定义了TTY_TERMINAL TRUE、SECURE_BOOT_ENABLE FALSE、QEMU_PV_VARS FALSE、TPM2_ENABLE FALSE等开关均可通过-D FLAGVALUE在命令行覆盖这一机制贯穿本文后续所有构建场景。环境准备x86 Linux 主机由于固件是面向 LoongArch64 架构的而日常开发环境通常是 x86因此需要在 x86 Linux 主机上准备交叉编译工具链与支持 LoongArch 的 QEMU。原文档给出了两条路径。路径一Fedora 39 及以上版本推荐Fedora 39 及更高版本直接通过发行版软件仓库提供 LoongArch 交叉编译器与系统 QEMU两条命令即可完成安装yum install gcc-loongarch64-linux-gnu yum install qemu-system-loongarch64其中gcc-loongarch64-linux-gnu提供loongarch64-unknown-linux-gnu-前缀的交叉工具链含 binutilsqemu-system-loongarch64提供qemu-system-loongarch64可执行文件二者缺一不可。路径二其他 x86 发行版手动配置交叉工具链对于非 Fedora 39 的发行版需要手动下载并配置龙芯Loongson官方发布的交叉工具链从 Loongson build-tools 发布页下载x86_64-cross-tools-loongarch64-binutils_2.41-gcc_13.2.0.tar.xz2023.08.08 版本内含 binutils 2.41 与 gcc 13.2.0满足上文版本要求。解压并导出 PATHmkdir /opt/loongarch64_cross-toolchain/ tar -vxf x86_64-cross-tools-loongarch64-binutils_2.41-gcc_13.2.0.tar.xz -C /opt/loongarch64_cross-toolchain/ export PATH/opt/loongarch64_cross-toolchain/cross-tools/bin:$PATH注意交叉工具链会持续更新建议以 Loongson build-tools 发布页的最新版本为准同时仍要确保其 GCC 与 Binutils 版本不低于上文的最低要求。构建带 LoongArch 支持的 QEMU如果发行版软件源中没有qemu-system-loongarch64则需要从 QEMU 官方仓库克隆源码自行编译git clone https://gitlab.com/qemu-project/qemu.gitQEMU 源码树中的doc/system/loongarch/virt.rst给出了 LoongArch virt 机型的完整编译与设备说明编译前请先参考该文档确认依赖与配置参数例如--target-listloongarch64-softmmu。编译完成后qemu-system-loongarch64即作为本文全部运行验证环节的执行载体。构建 LoongArch QEMU 虚拟机固件获取 EDK II 源码固件构建以本仓库EDK II为基础克隆时需包含子模块BaseTools 依赖的各类工具源码git clone --recurse-submodule https://github.com/tianocore/edk2.git使用 GCC 交叉编译固件在克隆出的 edk2 目录结构下依次执行以下命令完成环境初始化与构建export WORKSPACEpwd export GCC_LOONGARCH64_PREFIXloongarch64-unknown-linux-gnu- export PACKAGES_PATH$WORKSPACE/edk2 export EDK_TOOLS_PATH$WORKSPACE/edk2/BaseTools source edk2/edksetup.sh --reconfig make -C edk2/BaseTools source edk2/edksetup.sh BaseTools build -b RELEASE -t GCC -a LOONGARCH64 -p OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc对各步骤的说明WORKSPACE指向包含 edk2 的顶层目录PACKAGES_PATH必须指向edk2本体用于解析OvmfPkg/LoongArchVirt/...等包路径。GCC_LOONGARCH64_PREFIX指定交叉工具链前缀。若按 Fedora 方式安装前缀为loongarch64-unknown-linux-gnu-若使用 Loongson 手动工具链应检查其 bin 目录下实际前缀并对应修改。edksetup.sh --reconfig生成Conf/target.txt等构建配置随后编译 BaseTools再source edksetup.sh BaseTools将工具链路径导入当前 shell。构建命令中-b RELEASE指定目标为 RELEASEBUILD_TARGETS同时支持DEBUG|RELEASE|NOOPT-t GCC指定工具链标识-a LOONGARCH64指定架构-p指向平台 DSC 文件。构建完成后固件产物位于Build/LoongArchVirtQemu/RELEASE_GCC/FV/QEMU_EFI.fd该路径直接对应后文 QEMU 启动命令中的-bios参数。从 LoongArchVirtQemu.fdf 看QEMU_EFI.fd由FVMAIN_COMPACT承载其中按 APRIORI 顺序优先加载 PEI 阶段的Pcd.inf随后是 SEC 模块 SecMain.inf、PEI 核心与 PlatformPei.inf最后以 GUIDED 压缩段内嵌 DXE 固件卷。固件镜像与内存布局源码视角固件布局由 LoongArchVirt.fdf.inc 定义关键参数如下参数值含义BLOCK_SIZE0x1000Flash 块大小FW_BASE_ADDRESS0x1c000000固件基地址对应PcdOvmfFdBaseAddressFW_BLOCKS0x400块数量FW_SIZE0x400000固件总大小4 MiBSEC_PEI_TEMP_RAM_BASE0x10000SEC/PEI 临时 RAM 基址SEC_PEI_TEMP_RAM_SIZE0x80000SEC/PEI 临时 RAM 大小DEVICE_TREE_RAM_BASE0x100000设备树FDT加载基址变量存储区则由 VarStore.fdf.inc 定义QEMU_VARS区域总大小 0x100000016 MiB64 块 × 0x40000其中 0x00000000 起 0x40000 为 NV_VARIABLE_STORE变量存储含gEfiSystemNvDataFvGuid固件卷头与gEfiAuthenticatedVariableGuid变量存储头兼容 Secure Boot 与非 Secure Boot 场景0x00040000 起为 FTW Working 区故障容忍写工作区签名gEdkiiWorkingBlockSignatureGuid0x00080000 起为 FTW Spare 区。这份预置布局保证了固件首次启动即可直接使用 UEFI 变量服务。值得一提的是DSC 中针对 LoongArch QEMU TCG 模拟器给出了专门的链接选项LoongArchVirtQemu.dsc 的[BuildOptions.common.EDKII.DXE_CORE,...]默认页大小为 16K代码段需与数据段按 16K 页对齐-z common-page-size0x4000否则同一页内代码与数据混写会触发 QEMU 的 Translation Block 刷新开销DXE 运行时驱动则使用-z common-page-size0x10000。这是该平台区别于 x86 OvmfPkg 的一个重要实现细节。Secure Boot从固件构建到 QEMU 侧策略锁定LoongArchVirt 支持 Secure Boot但官方明确要求凡是希望将 Secure Boot 状态在客户机侧保持锁定locked的构建都必须使用 QEMU 提供的 UEFI 变量存储QEMU_PV_VARS而不能依赖传统的 pflash 变量存储。带 Secure Boot 的固件构建build -b RELEASE -t GCC -a LOONGARCH64 \ -p OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc \ -D SECURE_BOOT_ENABLETRUE \ -D QEMU_PV_VARSTRUE两个开关的源码级影响SECURE_BOOT_ENABLETRUEDSC 中启用PlatformSecureLib、AuthVariableLib、SecureBootVariableLib等认证变量相关库见 LoongArchVirtQemu.dsc 的[LibraryClasses.common]并将PcdSecureBootSupported置 TRUE、PcdMaxAuthVariableSize提升至 0x2800、PcdVariableStoreSize提升至 0xC0000同时把PcdOptionRomImageVerificationPolicy、PcdFixedMediaImageVerificationPolicy、PcdRemovableMediaImageVerificationPolicy全部设为 0x04拒绝执行。QEMU_PV_VARSTRUEDSC 中置PcdQemuVarsRequire TRUE并关闭变量运行时缓存PcdEnableVariableRuntimeCache FALSEFDF 中改用VirtMmCommunicationDxe与VariableSmmRuntimeDxe组合固件通过 MM 通信将变量服务请求转发给 QEMU 的uefi-vars-sysbus设备处理而不是本地读写 Flash。关于 QEMU UEFI 变量存储的机制背景可参考 QEMU_PV_VARS.md自 QEMU 10.02025 年 4 月发布起QEMU 可为客户机提供 UEFI 变量存储其与传统 pflash 方案的本质区别在于——访问控制与认证变量更新的签名校验由 QEMU宿主机侧完成从而消除了对 x86 上 SMM 这类特权客户机模式的需求使 Secure Boot 支持大幅简化。该机制在OvmfPkg/LoongArchVirt上通过 sysbus 变体uefi-vars-sysbus基于设备树发现设备接入。配置 QEMU 侧策略锁定 Secure Boot 状态使用QEMU_PV_VARSTRUE构建的固件启动 QEMU 时必须为uefi-vars-sysbus设备配置策略选项使 Secure Boot 保持开启并阻止客户机进入 Custom Mode自定义模式-device uefi-vars-sysbus,jsonfile/path/to/varstore.json,\ disable-custom-modeon,force-secure-booton各参数含义jsonfile/path/to/varstore.json指定变量存储的 JSON 持久化文件该文件需预先创建例如touch /path/to/varstore.json以实现变量在 QEMU 退出后依然保留若省略该参数变量仅能跨 reboot 存活虚拟机QEMU进程退出即丢失。disable-custom-modeon禁止客户机通过 UEFI 变量服务切换到 Custom Mode。force-secure-booton强制保持 Secure Boot 开启。原文档特别强调若不加这些 QEMU 侧策略选项虚拟机管理器将无法阻止客户机通过 UEFI 变量服务修改 Custom Mode 或 Secure Boot 状态。这是因为LoongArchVirt 不提供硬件背书的物理存在physical-presence机制因此锁定式 Secure Boot 部署必须把该策略显式表达在 QEMU 配置中。Secure Boot 变量PK、KEK、db、dbx的预置材料可参考仓库内的 SecureBootKeys/README.md平台树默认不携带任何证书或私钥该目录仅为本地验证 Secure Boot 流程时放置平台专属 PK/KEK/db/dbx 工件的占位布局如需内置密钥材料须在树外自行添加并在构建中显式接线对应LoongArchVirtQemu.fdf中的FILE FREEFORM段。运行验证一固件级启动测试构建完成后可用如下命令直接启动固件验证 UEFI 固件本身能否在 QEMU virt 机型上正常运行qemu-system-loongarch64 \ -m 4G \ -M virt \ -smp 2 \ -cpu la464 \ -bios Build/LoongArchVirtQemu/RELEASE_GCC/FV/QEMU_EFI.fd \ -serial stdio参数说明-m 4G客户机内存 4 GiB。平台对 UEFI BIOS 的最小内存要求为 512 MiBDSC 注释中给出 0x00000000-0x10000000 与 0x90000000-0xA0000000 两段可用的地址区间4 GiB 为常见裕量配置。-M virt使用 QEMU 的 virt 通用机型与平台名中的 virt 对应。-smp 22 个 vCPU。-cpu la464指定 LoongArch 处理器型号la464对应龙芯 3A5000 系列微架构。UEFI 规范下多核启动依赖 MP 协议该平台通过MpInitLibPEI 阶段见 LoongArchVirtQemu.dsc 中MpInitLib|UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf完成 AP 初始化。-bios指向固件产物QEMU_EFI.fd路径相对构建时的工作目录。-serial stdio将串口重定向到当前终端。该平台串口通过 FDT 发现 16550 兼容设备见Fdt16550SerialPortHookLib与EarlyFdtSerialPortLib16550默认波特率 115200、MMIO 访问DSC 中PcdSerialUseMmio TRUE、PcdSerialBaudRate 115200配合TTY_TERMINAL TRUE默认使用 TTY 终端类型PcdDefaultTerminalType 4便于直接在终端上看到 UEFI Shell 与启动管理器界面。正常启动后应能在串口终端看到 EDK II 的启动横幅并进入 UEFI 交互环境如需调试信息可将-b RELEASE改为-b DEBUG并依据 DSC 中PcdDebugPrintErrorLevel 0x8000004F的位掩码调整-D调试级别。运行验证二操作系统级启动测试在固件验证通过后可进一步加载真实操作系统镜像完成从固件到 OS 的完整启动链路验证。原文档给出两类官方渠道镜像ArchLinuxLoongArch 版从北京大学镜像站提供的 ArchLinux QCOW2 镜像目录下载镜像并按镜像站附带的运行说明Running LoongArch ArchLinux on virtual machine配置启动参数。openEuler 22.03 LTS从南京大学镜像站下载openEuler-22.03-LTS-LoongArch-loongarch64.qcow2.xz虚拟化镜像格式需先解压 .xz例如# 以 openEuler 为例示意 qemu-system-loongarch64 \ -m 4G \ -M virt \ -smp 2 \ -cpu la464 \ -bios Build/LoongArchVirtQemu/RELEASE_GCC/FV/QEMU_EFI.fd \ -drive fileopenEuler-22.03-LTS-LoongArch-loongarch64.qcow2,formatqcow2,ifvirtio \ -serial stdioOS 启动过程依赖的固件侧支撑在 DSC/FDF 中均有对应模块磁盘引导经PartitionDxeGPT/MBR 分区、FatPkg/EnhancedFatDxeFAT 文件系统与VirtioBlkDxe/VirtioScsiDxevirtio 块设备完成ACPI 表由OvmfPkg/AcpiPlatformDxe注入DSC 中PcdAcpiExposedTableVersions 0x06暴露 ACPI 2.0 与 3.0RTC 由平台专属的LsRealTimeClockLib提供复位路径则走ResetSystemAcpiLibPEI/DXE 两个变体分别对应 Base/Dxe 库。若启动过程中 OS 需要显示输出可追加-device virtio-gpu-pci或使用固件内置的QemuVideoDxe/VirtioGpuDxe图形栈。平台源码结构速览便于深入阅读OvmfPkg/LoongArchVirt目录采用清晰的模块划分按需查阅即可SecSEC 阶段入口Start.S 为 LoongArch64 汇编启动代码SecMain.c 完成临时 RAM 建立并产生gEfiTemporaryRamSupportPpiGuid。PlatformPeiPEI 阶段平台初始化Platform.c、MemDetect.c、Fv.c负责内存探测、FDT 传递与固件卷定位。Drivers/StableTimerDxe平台定时器驱动TimerDxe.inf提供稳定的架构定时器。Library平台专属库包括串口EarlyFdtSerialPortLib16550、Fdt16550SerialPortHookLib、RTCLsRealTimeClockLib、复位ResetSystemAcpiLib与 MMU 初始化CpuMmuInitLib。Feature/SecureBoot/SecureBootKeysSecure Boot 密钥占位目录不含默认密钥。构建描述LoongArchVirtQemu.dsc平台配置、LoongArchVirtQemu.fdfFlash 布局与模块装入、LoongArchVirt.fdf.inc布局常量、VarStore.fdf.inc变量存储区。结语与注意事项本文完整覆盖了 EDK IIOvmfPkg/LoongArchVirt平台从交叉环境准备、固件构建、Secure Boot 锁定到两级运行验证的完整流程。实践中有三点最易出错需特别留意版本门槛QEMU ≥ 8.1、GCC ≥ 13、Binutils ≥ 2.40 缺一不可且 QEMU UEFI 变量存储uefi-vars-sysbus需要 QEMU 10.0 及以上。前缀匹配GCC_LOONGARCH64_PREFIX必须与实际交叉工具链的二进制前缀一致否则链接阶段会因找不到loongarch64-unknown-linux-gnu-*工具而失败。Secure Boot 锁定是 QEMU 侧职责仅加SECURE_BOOT_ENABLETRUE而不配置QEMU_PV_VARSTRUE与uefi-vars-sysbus的disable-custom-modeon,force-secure-booton策略客户机仍可通过变量服务篡改 Secure Boot 状态这是 LoongArchVirt 无物理存在机制下的安全边界务必按文中方式在 QEMU 配置中显式表达。赞分享固件操作系统驱动开发嵌入式【免费下载链接】edk2EDK II项目地址https://gitcode.com/gh_mirrors/ed/edk2点击查看免费下载相关推荐Flowable Event Registry 的 Spring 集成EventRegistryFactoryBean、自动部署与单元测试实战指南Flowable Event Registry 的 Spring 集成EventRegistryFactoryBean、自动部署与单元测试实战指南 导读 Fl固件操作系统驱动开发嵌入式EDK II RISC-V QEMU virt 平台固件完全指南从源码构建到 QEMU 启动与自定义 OpenSBIEDK II RISC V QEMU virt 平台固件完全指南从源码构建到 QEMU 启动与自定义 OpenSBI 本篇技术指南以 EDK II 仓库中 O固件操作系统驱动开发嵌入式EDK II EmulatorPkg 平台 CI 构建指南基于 Pytools 的本地构建与模拟器自动化运行EDK II EmulatorPkg 平台 CI 构建指南基于 Pytools 的本地构建与模拟器自动化运行 本篇技术指南以 EDK II 仓库中 Emula固件操作系统驱动开发嵌入式上一篇FlexSearch 自定义构建Custom Builds完全指南按需裁剪功能、压缩体积与多格式打包下一篇G-Helper笔记本风扇噪音控制指南三步调低华硕游戏本风扇转速的完整方法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表