当前位置: 首页 > news >正文

EDK2环境搭建以及HelloWorld编译实现

EDK2环境搭建以及HelloWorld编译实现

TianoCore的官方介绍

Welcome to TianoCore, the community supporting an open source implementation of the Unified Extensible Firmware Interface (UEFI). EDK II is a modern, feature-rich, cross-platform firmware development environment for the UEFI and UEFI Platform Initialization (PI) specifications. We hope that you’ll review our wiki documentation, use TianoCore for platform firmware, report any issues you find, and contribute to the community.

欢迎来到 TianoCore 社区!我们致力于支持 UEFI(统一可扩展固件接口)的开源实现。EDK II 是一个现代化、功能强大且跨平台的固件开发环境,完全遵循 UEFI 及 UEFI PI(平台初始化)规范。我们诚挚地邀请您:阅读我们的 Wiki 文档。使用 TianoCore 开发平台固件。报告您遇到的任何问题。积极为社区贡献力量。

UEFI & EDKII & OVMF

  1. UEFI是一种标准或者规范手册。它定义了系统的启动流程,实现从硬件到操作系统的引导过程,定义了固件与操作系统之间的接口。比方说要盖房子,规范就规定了房子要有承重墙,电路布线规则,门窗大小等。
  2. EDK2的全称是EFI Development Kit II,是由Intel主导的开源UEFI开发框架。开发者可以基于EDK2编写自己的UEFI固件。
  3. OVMF全称是Open Virtual Machine Firmware,是EDK2的一个子项目,专门针对QEMU虚拟机环境提供UEFI支持。输出的文件通常是OVMF.fd或者OVMF_CODE.fd / OVMF_VARS.fd

EDK2环境搭建

  1. 安装依赖

    sudo apt update
    sudo apt install -y build-essential uuid-dev iasl git nasm\
    python3-distutils python2-pip python3-setuptools python3-venv python3-dev\
    flex bison openssl libssl-dev libpython3-dev
    
  2. 获取源码

    # edk2的GitHub官网 https://github.com/tianocore/edk2/tree/master
    # 获取稳定版本
    git clone https://github.com/tianocore/edk2.git -b stable/202011
    
    mkdir -p ~/src
    cd ~/src
    git clone https://github.com/tianocore/edk2.git -b stable/202011
    cd edk2
    git submodule update --init
    
  3. 编译BaseTools

    cd ~/src/edk2
    make -C BaseTools# 完成后期望看到 GenFv GenFw GenFfs VolInfo 等工具
    ls -l BaseTools/Source/C/bin
    
  4. 初始化构建环境

    cd ~/src/edk2
    source edksetup.sh
    

    这一步会在Conf/下生成targart.txt、tool_def.txt。如果以后每次打开新shell要构建,可以把这句加入到~/.bashrc。

  5. 编辑Conf/targart.txt

    # 适用于本地x86_64的最小配置
    ACTIVE_PLATFORM       = OvmfPkg/OvmfPkgX64.dsc
    TARGET                = DEBUG
    TARGET_ARCH           = X64
    TOOL_CHAIN_TAG        = GCC5
    BUILD_RULE_CONF       = Conf/build_rule.txt
    

    ACTIVE_PLATFORM指向要构建的Platform.dsc(这里是OVMF x64)。
    TOOL_CHAIN_TAG = GCC5这里的GCC5是默认选项,不用改成GCC

  6. 构建OVMEx64固件)

    cd ~/src/edk2
    source edksetup.sh
    build -a X64 -t GCC5 -p OvmfPkg/OvmfPkgX64.dsc -b DEBUG# 构建成功后,固件文件位于
    ~/src/edk2/Build/OvmfX64/DEBUG_GCC5/FV/
    # 重要文件示例:OVMF_CODE.fd OVMF_VARS.fd OVMF.fd
    

    此时其实固件已经生成完毕了。

  7. 生成直接可用的bios.bin(可选)

    cd ~/src/edk2/Build/OvmfX64/DEBUG_GCC5/FV
    cat OVMF_CODE.fd OVMF_VARS.fd > ~/run-ovmf/bios.bin
    # 校验大小接近 OVMF_CODE + OVMF_VARS
    ls -lh ~/run-ovmf/bios.bin
    
  8. 创建测试用的FAT磁盘目录

    mkdir -p ~/run-ovmf/hda-contents/EFI/BOOT
    

    把一个 64-bitEFI 程序放进去,下面编译HelloWorld

  9. HelloWorld编译

    # 默认HelloWorld的位置在:MdeModulePkg/Application/HelloWorld/HelloWorld.inf
    build -a X64 -t GCC5 -p MdeModulePkg/MdeModulePkg.dsc -m MdeModulePkg/Application/HelloWorld/HelloWorld.inf# 生成的文件路径:Build/MdeModule/DEBUG_GCC5/X64/HelloWorld.efi
    cp ~/src/edk2/Build/MdeModule/DEBUG_GCC5/X64/HelloWorld.efi hda-contents/EFI/BOOT/BOOTX64.EFI
    
  10. 运行QEMU

    cd ~/run-ovmf
    qemu-system-x86_64 \-bios ~/src/edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd \-drive format=raw,file=fat:rw:~/run-ovmf/hda-contents \-m 512Mcat OVMF_CODE.fd OVMF_VARS.fd > ~/run-ovmf/bios.bin
    qemu-system-x86_64 \-bios ~/run-ovmf/bios.bin \-drive format=raw,file=fat:rw:~/run-ovmf/hda-contents \ -m 1024Mqemu-system-x86_64 -bios D:\users\wsy\Desktop\EDK2\edk2\OVMF.fd -drive format=raw,file=fat:rw:D:\users\wsy\Desktop\EDK2\edk2\run-ovmf\hda-contents -m 512M
    

    以上两个命令有所区别。OVMF.fd的固件结构是单文件,是CODEVARS在一起的。其中CODE是UEFI的代码段,VARS是内嵌的变量存储区,这种情况下启动后修改的UEFI变量不会持久保存,下次启动会恢复初始状态。与之相反的是第二条命令,其可以持久保存UEFI的设置。

http://www.fuzeviewer.com/news/1583/

相关文章:

  • 谁生?谁死?从引用计数到可达性分析,洞悉GC的决策逻辑
  • 五、阅读笔记五 应对复杂系统的挑战
  • Day6综合案例2-注册信息
  • 2014吉林省赛题解 | CCUT应用OJ——Sign in
  • P3607 [USACO17JAN] Subsequence Reversal P 题解
  • 10/28
  • URL验证绕过速查表:全面解析SSRF与CORS绕过技术
  • 2025年河南工业大学2025新生周赛(1)
  • CF506E Mr. Kitayutas Gift
  • 2025.10.28
  • MyBatis 动态 SQL 实现原理 - Higurashi
  • 最小二乘问题详解6:梯度下降法
  • 现代C++编程初体验
  • Python冒泡排序:简单易懂的算法实现
  • 集训做题杂记1 - -MornStar
  • CF1909I Short Permutation Problem
  • ROS1 go2 vlp16 局部避障--3 篇 - 教程
  • CSP-S模拟41
  • 禁用 IPython 历史记录 history.sqlite
  • 实验二 现代C++编程初体验
  • 周康阳精选冲刺省选国赛思维训练题
  • P3939 数颜色
  • 2025年压力容器厂家综合评测与选择指南
  • 项目构建优化:Make 与 Makefile
  • 11hhs
  • 在vue-markdown-render中解析LaTeX公式
  • CSP-S NOIP 2025 备考
  • ICPC Nanjing Regional (部分题题解)
  • 分布式锁巅峰对决:Redis RedLock vs ZooKeeper临时节点——Redission看门狗如何破解续期困局 - 教程
  • MySQL 数据加密整改文档(TDE + 字段加密 + 密码哈希)