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.mzph.cn/news/949231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谁生?谁死?从引用计数到可达性分析,洞悉GC的决策逻辑

谁生?谁死?从引用计数到可达性分析,洞悉GC的决策逻辑引用计数与可达性分析:谁死了,谁还活着? 垃圾回收,顾名思义,便是将已经分配出去的,但却不再使用的内存回收回来,以便能够再次分配。在Java虚拟机的语境下…

P1561 [USACO12JAN] Mountain Climbing S

Solution 简单看题容易得到一个错误的贪心: \[ans=max\{\Sigma_{k=1}^n + down_{min}, \Sigma_{k=1}^n +up_{min}\} \]然后你将可以把他 hack 掉,因为最初的方法认为第一个牛上山后,所有上下山是一起进行的,其实有…

六、阅读笔记六:保障软件可靠性的防线

《程序员修炼之道:从小工到专家》围绕软件测试与质量保障展开,系统阐述了如何通过科学的测试方法和质量管控策略,构建可靠的软件产品。在软件开发生命周期中,测试与质量保障是不可或缺的环节,它能够及时发现潜在问…

以此贴作别算法

以此贴作别算法def lcs(i, j):if i == m or j == n: return 0if s[i] == t[j]: return 1 + lcs(i+1, j+1)return max(lcs(i, j+1), lcs(i+1, j))def lcs2(i, j):if i >= m or j >= n: returni0 = i; j0 = jwhile…

五、阅读笔记五 应对复杂系统的挑战

《程序员修炼之道:从小工到专家》聚焦于并发编程与系统性能优化,为应对复杂系统的技术挑战提供了全面的解决方案。随着软件系统的规模不断扩大,用户量持续增长,并发处理能力和系统性能成为衡量软件质量的重要指标。…

P3988 [SHOI2013] 发牌

Solution 容易发现,答案就是维护当前序列的第 k 大值,而且只有删除,这个时候就可以使用权值线段树来维护。这颗树的每一个叶子表示一张牌,然后线段树记录改节点为根的子树的节点个数,接着进行查询即可,代码见下…

映射

通过ide伪造数据库 映射 Map 首先我们来了解一下什么是映射 先直到 key,value 它们往往是一对 一个键只能对应一个值,但一个值可以对应多个键 例如 苹果 -> 水果 菠萝 -> 水果 人名 -> 电话号码 学号 ->…

文件夹显示绿色成功图标方法

链接:https://blog.csdn.net/jiminkoo/article/details/131840356本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/19172967

【RabbitMQ】与ASP.NET Core集成

本章目标掌握在ASP.NET Core中配置和依赖注入RabbitMQ服务。学习使用IHostedService/BackgroundService实现常驻消费者服务。实现基于RabbitMQ的请求-响应模式。构建完整的微服务间异步通信解决方案。学习配置管理和健…

IMO2025 Problem 1

考虑 \(n = 3\) 时的下三角,显然有三个容易构造的解,\(k = \{0, \, 1, \, 3\}\),构造如下:那么 \(n > 3\) 呢?由于下三角的点数恰好为 \(1 + 2 + \cdots + n\) 个点,对于第一条直线,有且仅有 \(3\) 中方式覆…

Day6综合案例2-注册信息

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

2014吉林省赛题解 | CCUT应用OJ——Sign in

题目简介题源:1035-Sign in | CCUT OJ,2014 吉林省赛 C 题 题意:给定长为 \(n\) 的序列 \(A\) 与长为 \(n-1\) 的序列 \(B\),其中 \(B\subset A\),求 \(A-B\)。即:\(B\) 中恰好只有一个元素在 \(A\) 中没出现,求…

访答知识库-可以本地使用的知识库

访答知识库-可以本地使用的知识库访答知识库,一键安装,0代码使用。 支持图片、视频、语音搜索与问答 支持多模态问答

代码大全2 第三四章

读《代码大全 2》第三、四章,感觉像听老程序员唠实用嗑,没半点虚头巴脑的理论。第三章讲代码可读性,真是说到心坎里了。以前总觉得代码能跑就行,变量随便叫个 a、b、c,注释能省就省。结果过半个月回头看,自己写的…

https代理服务器(六)再次java动态签发【成功】

https代理服务器(六)再次java动态签发【成功】1X500Name canamem = new X500Name(caCertificate.getSubjectX500Principal().getName());改为X500Name issuerName = new JcaX509CertificateHolder(caCertificate).ge…

[AGC032D] Rotation Sort 题解

QwQ[AGC032D] Rotation Sort 题解 把循环移位看作是将某个数向左或右插入到任意位置,显然一个数最多被移动一次。 那么该序列中一共有三种数:向左移动 向右移动 不动假设已知每个数属于哪一种,考虑如何判定该方案是…

[AGC024E] Sequence Growing Hard 题解

QwQ[AGC024E] Sequence Growing Hard 题解 首先手玩一下样例,考虑在哪些位置插入是合法,假设在 \(pos\) 位置前插入 \(x\),则如果 \(x > a_{pos}\),则显然字典序会变大,否则如果 \(a_{pos} = x\) 需要找到 \(p…

新学期每日总结(第15天)

今日 相较昨日 学习下载数据库

实验2 现代C++编程初体验

任务1 源代码 T.h#pragma once#include <string>// 类T: 声明 class T { // 对象属性、方法 public:T(int x = 0, int y = 0); // 普通构造函数T(const T &t); // 复制构造函数T(T &&t); /…