UEFI学习笔记(二):edk2构建编译流程

news2024/12/22 20:38:08

UEFI入门(二):edk2项目编译流程

  • 一、Build流程框架
    • Build的三个阶段:
      • 1、Autogen
      • 2、Make
      • 3、ImageGen
  • 二、编译构建步骤:
    • 1. 安装依赖工具
    • 2. 初始化构建环境
    • 3. 配置工具链和目标
    • 4. 定义平台配置
    • 5. 构建并编译
  • 三、uefi-tools编译edk2实践:
    • 1. 克隆EDK2 项目
    • 2. 构建并编译
  • 参考文章:

一、Build流程框架

Build Process Overview

Build的三个阶段:

1、Autogen

解析meta-data文件,dsc文件,.inf文件,.fdf文件,.dec文件,生成Autogen.c 、Autougen.h 、.depex、 Makefiles等文件

2、Make

主要是来处理source文件并通过Make生成符合EFI格式的PE32/PE32+/COFF 文件。

3、ImageGen

主要是来处理binary文件和EFI格式的文件,产生最终的UEFI Flash Images, Capsules,Applications和PCI Option ROMs

二、编译构建步骤:

1. 安装依赖工具

在开始编译之前,需要确保所有依赖工具已经安装并配置好,主要包括:
1)编译工具链(如 GCC、Clang、MSVC、ARMCC 等)
2)构建工具(如 BaseTools 中的 GenFds、GenFw 等工具)
3)Python(用于运行构建脚本)
4)NASM(汇编器)

2. 初始化构建环境

通过运行 edksetup.sh 或 edksetup.bat(视操作系统而定)来初始化构建环境。

3. 配置工具链和目标

Conf 目录中配置构建参数。主要的配置文件包括:
1)target.txt:定义构建目标模式(DEBUG、RELEASE)、工具链标签(如 GCC5、VS2019 等)、目标架构(如 X64、IA32、AARCH64 等)。
2)tools_def.txt:定义每种工具链的路径和编译选项。
3)build_rule.txt:定义如何编译和链接各个文件类型。

4. 定义平台配置

每个平台有其对应的 .dsc 文件(平台描述文件)和 .fdf 文件(固件描述文件),用来定义要构建的平台、所包含的模块、库、驱动程序,以及固件映像的布局。.dsc 文件是编译每个模块的主要参考,而 .fdf 文件是生成固件映像时的重要文件。

5. 构建并编译

使用 build 命令来启动构建过程。该命令会读取 target.txt 和 .dsc 文件中的配置信息,调用相应的编译器和工具链来构建模块。

在构建过程中,build.py 脚本会执行以下步骤:
1)解析配置文件:解析 .dsc 文件中的平台配置和模块定义,确定需要编译的模块和库

2)依赖分析:分析模块之间的依赖关系,确保各个模块按正确的顺序编译

3)编译源码:根据工具链配置调用编译器(如 gcc、clang 等)编译源文件(.c、.cpp、.asm 等),生成目标文件(.obj)

4)链接生成模块:将生成的目标文件通过链接器(如 ld、link 等)链接为可执行的二进制文件(如 .efi 文件)

5)生成固件映像:根据 .fdf 文件定义的固件布局,使用 GenFds 工具将各个二进制模块打包成固件映像文件(如 .fd、.rom、.bin 等)。生成的映像文件通常位于 Build/ 目录中,常见的格式有:
.fd:Firmware Descriptor(固件描述文件),是完整的固件映像文件。
.rom:BIOS ROM 文件。
.bin:可执行的固件映像文件。

三、uefi-tools编译edk2实践:

使用 uefi-tools 编译 UEFI 固件的流程与传统的 EDK2 构建有所不同,它通过封装更简化了编译过程。

1. 克隆EDK2 项目

git clone https://github.com/tianocore/edk2.git

然后,进入 EDK2 目录并获取所需的子模块:

cd edk2
git submodule update --init

2. 构建并编译

../uefi-tools/edk2-build.sh -p MyPlatformPkg/MyPlatformPkg.dsc -a X64 -t GCC5 -b DEBUG

-p:指定平台描述文件路径。
-a:指定目标架构(如 X64、IA32)。
-t:指定工具链标签。
-b:指定构建模式(DEBUG 或 RELEASE)。

参考文章:

UEFI中的edk2编译流程_edk2代码走读
【UEFI实战】EDK的编译流程说明
EDK2 Build Flow
EDK II编译过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2125716.html

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

相关文章

怎么通过Java实现和数据库的连接???(附带练习)

JDBC 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1,JDBC概述 在开发中我们使用的是java语言,那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的…

STL-stack/queue/deque(容器适配器)

目录 ​编辑 STL-stack 150. 逆波兰表达式求值 stack queue std::stack deque 性能测试 结构 STL-stack 栈的压入、弹出序列_牛客题霸_牛客网输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假。题目…

TESSY创建以及设计一个测试用例

我们以tessy5.1 IDE为例,给大家展示编写一个测试用例的过程。 还不会创建工程的,可以参考以下这篇文章: TESSY创建单元测试或集成测试工程_tessy 集成测试-CSDN博客 接下来我们以这个作为开始状态进行介绍 1、添加源文件 2、添加头文件路径…

存储型XSS漏洞

1.介绍 存储型XSS攻击是一种常见的网络攻击,也称为持久型XSS攻击。与反射型XSS攻击不同,存储型XSS攻击将恶意代码存储在服务器端或数据库中,当其他用户访问该网页时,恶意代码会被执行,导致用户的信息被窃取或造成其他…

Redis相关命令详解

目录 一、认识Redis 二、string 1、重要知识 2、基础命令 3、Key值的设置 三、list 1、重要知识 2、存储结构 3、基础命令 4、list的应用场景 四、hash 1、重要知识 2、基础命令 五、set 1、重要知识 2、基础命令 3、具体应用 六、zset 1、重要知识 2、…

“禁塑行动·我先行”广州绿葆网络发展有限公司与辽宁省慈善联合总会共谱环保新篇章

2024年9月9日,在国家大力推进生态文明建设、全面实施禁塑令政策的大背景下,农工同心公益基金“禁塑行动我先行”公益捐赠辽宁省启动仪式在辽宁省成功举办。此次活动由辽宁省慈善联合总会、农工党辽宁省委会主办,辽宁省慈善联合总会农工同心公…

MUR2060CT-ASEMI快恢复二极管MUR2060CT

编辑:ll MUR2060CT-ASEMI快恢复二极管MUR2060CT 型号:MUR2060CT 品牌:ASEMI 封装:TO-220AB 安装方式:插件 批号:最新 恢复时间:35ns 最大平均正向电流(IF)&#…

噪声的消除

开关电源的干扰一般是几十K到几百K: 【电源噪声查不出来?不用上板子,滤波器仿真就能搞定】https://www.bilibili.com/video/BV12v411r798?vd_source3cc3c07b09206097d0d8b0aefdf07958 村田消除噪声的仿真软件: SimSurfing - 村…

Kafka原理剖析之「Topic创建」

一、前言 Kafka提供了高性能的读写,而这些读写操作均是操作在Topic上的,Topic的创建就尤为关键,其中涉及分区分配策略、状态流转等,而Topic的新建语句非常简单 bash kafka-topics.sh \ --bootstrap-server localhost:9092 \ // …

QT设置闹钟超时播报

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimerEvent> #include<QTime> #include<QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic…

mysql 之 information_schema

information_schema 是 MySQL 中的一个特殊数据库&#xff0c;它提供了关于 MySQL 服务器中所有数据库、表、列、索引、存储过程、函数、触发器等对象的元数据信息。information_schema 是一个只读数据库&#xff0c;主要用于查询数据库的结构信息&#xff0c;而不是存储用户数…

【Unity踩坑】创建新项目后提示编译错误要进入安全模式

在创建了新项目后&#xff08;比如URP&#xff0c;AR&#xff0c;VR&#xff09;&#xff0c;首次打开时提示有编译错误&#xff0c;要进入安全模式。 脚本是项目模板自带的&#xff0c;不会有问题。这时需要先选择进入安全模式&#xff0c;然后关闭项目&#xff0c;重新打开就…

C++之函数进阶

函数默认参数 注意事项&#xff1a; 1. 如果从某个位置开始&#xff0c;有了默认参数&#xff0c;那么从这个位置往后&#xff0c;都必须有默认参数 2. 函数声明和函数定义只能有一个进行默认参数设置 函数占位参数 函数重载 函数名相同void fun()&#xff0c;功能实现不同 提高…

arxiv 首次投稿注意事项记录

文章目录 注册用教育邮箱&#xff0c;不用背书latex&#xff1a; 主tex和bib文件放在最外层&#xff0c;重命名为arxiv.tex和arxiv.bib &#xff08;没测试过不重命名会怎么样&#xff09;在overleaf右上方点submmit&#xff0c;选arxiv&#xff08;这样会自动生成一个bbl文件&…

基于HTML5的下拉刷新效果

基于HTML5的下拉刷新效果 效果示例图示例代码 效果示例图 示例代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport&quo…

储能系统:工商业绿色转型的“稳压器”与“利润加速器”

在当今工商业领域&#xff0c;随着生产规模的扩大与新能源应用的快速普及&#xff0c;负荷峰谷差日益成为制约企业可持续发展的瓶颈。新能源的间歇性与不稳定性&#xff0c;更是让电网电能质量波动加剧&#xff0c;成本持续攀升。然而&#xff0c;在这一挑战背后&#xff0c;蕴…

基于Java+ssm+jsp开发的相亲交友网站管理系统

项目简介 该项目是基于Javassmjsp开发的婚恋交友网站管理系统&#xff0c;这是一项为大学生课程设计作业而开发的项目。 该系统旨在帮助大学生学习并掌握Java编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Java的婚恋交友管理系统项目&#xff0c;大学生…

源代码如何防泄漏?用对软件真的很重要!

在数字化时代&#xff0c;源代码的安全保护对企业来说至关重要。源代码泄露不仅会导致企业技术优势的丧失&#xff0c;还可能引发严重的经济损失和法律风险。因此&#xff0c;实现源代码防泄漏成为了企业信息安全战略中的重要一环。 深信达的SDC沙盒防泄密软件正是在这样的背景…

【leetcode_python】杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] 方案&#…

Facebook的虚拟现实功能简介:社交网络的新前沿

在科技飞速发展的今天&#xff0c;虚拟现实&#xff08;VR&#xff09;已经从科幻小说中的梦想变成了触手可及的现实。作为全球领先的社交平台&#xff0c;Facebook&#xff08;现已更名为Meta&#xff09;正大力推动虚拟现实技术的发展&#xff0c;以重新定义用户的社交体验。…