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

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

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

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

一、编译构建流程:

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的编译流程说明

http://www.lryc.cn/news/434318.html

相关文章:

  • 局域网一套键鼠控制两台电脑(台式机和笔记本)
  • 最新Nessus2024.9.8版本主机漏洞扫描/探测工具下载Windows版
  • 关于使用 @iconify/vue2图标库组件的离线使用
  • pdfmake生成pdf的使用
  • PLM系统有哪些品牌推荐?国内不错的PLM厂商有哪些?
  • Linux网络:网络套接字-TCP回显服务器——多进程/线程池(生产者消费者模型)
  • Redis 篇-深入了解基于 Redis 实现消息队列(比较基于 List 实现消息队列、基于 PubSub 发布订阅模型之间的区别)
  • python 学习一张图
  • 通过Docker部署 MongoDB 服务器
  • 无人机避障雷达技术详解
  • 2009-2023年上市公司华证esg评级评分数据(年度+季度)(含细分项)
  • C++ 模板进阶知识——stdenable_if
  • 国内外ChatGPT网站集合,无限制使用【2024-09最新】~
  • 如何在VUE3中使用函数式组件
  • linux访问外网的设置
  • PHP轻松创建高效收集问卷调查小程序系统源码
  • Redis面试必问:Redis为什么快?Redis五大基本数据类型
  • InternVL2- dockerfile环境变量持久化使用`ENV`而不是`RUN export`来设置环境变量,以确保环境变量在容器运行时仍然可用
  • Python(PyTorch和TensorFlow)图像分割卷积网络导图(生物医学)
  • DevOps实现CI/CD实战(七)- Jenkins集成k8s实现自动化CI
  • 从ES6到ES2023 带你深入了解什么是ES
  • openVX加速-常见问题:适用场景、AI加速、安装方式等
  • 国产芯片LT8711HE:TYPE-C/DP1.2转HDMI2.0转换器,4k60Hz高分辨率
  • 论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey
  • Java+Swing用户信息管理系统
  • 数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值特殊矩阵的压缩存储
  • C# 关于多线程同步不同实现方式
  • 【人工智能学习笔记】4_2 深度学习基础之多层感知机
  • WPS2019如何打出各种横线
  • Vue获取后端重定向拼接的参数