首页 > 系统相关 >ubuntu20.04下搭建EDK2开发环境

ubuntu20.04下搭建EDK2开发环境

时间:2023-12-07 14:48:33浏览次数:52  
标签:ubuntu20.04 git EDK2 edk2 构建 UEFI MyEfiApp 搭建

EDK2是UEFI应用程序的官方开发环境。它是由开源的Tianocore项目开发的,英特尔、惠普和微软是该项目的主要贡献者。虽然它可能比GNU-EFI大,但它有更多的功能,因此,一些操作系统开发人员可能更喜欢它而不是GNU-EFI。

什么是EDK2?

EDK2完全实现了UEFI规范。它包含开放虚拟机固件(OVMF) UEFI固件包,主要针对QEMU,许多操作系统开发人员使用它来测试他们的UEFI应用程序。它也有用于QEMU和各种板的ARM和AArch64固件包,以及用于各种HiFive板的RISC-V固件包。它还为UEFI驱动程序开发人员提供了工具。

EDK2的结构

EDK2由多个仓库组成,所有这些仓库都可以在https://github.com/tianocore上找到。主要有:

  • edk2,它包含构建系统、库、OVMF和ArmVirt固件。
  • edk2-platforms,其中包含用于各种真实硬件平台的固件,例如SiFive U450、Raspberry Pi等。
  • edk2-non-osi,它包含各种平台的专有二进制blob。

EDK2本身是用C语言和一些Python编写的,并在BSD 2 Clause +专利许可下获得许可。这些blobs都有自己的许可证。

目录结构

EDK2被分成多个子目录,每个子目录通常包含一个“包”。OvmfPkg子目录包含OVMF, MdePkg子目录包含UEFI库,等等。其中每一个都包含一个以.dsc结尾的文件。该文件描述文件夹内的包,并包含诸如依赖项、不同组件等内容。每个组件都有自己的文件,其中包含源、应用程序类型等。

构建EDK2基础

无论您尝试从EDK2构建什么,都必须完成这些步骤。首先,您必须决定是否只想在主要的EDK2仓库中构建东西,还是也想从EDK2平台中构建东西。注意,这些指南假定您使用的是Linux系统(Linux的Windows子系统也可以)。

使用edk2平台进行构建

确保你已经安装了所有的依赖项:

 apt install build-essential git python2 uuid-dev nasm acpica-tools 

如果您确实需要在真实硬件上运行的固件,那么您必须执行以下步骤。

首先,我们需要创建工作空间文件夹

mkdir edk2 && cd edk2
export WORKSPACE=$PWD

现在我们需要将源代码克隆到所有的仓库。edk2-non-osi是可选的,具体取决于您正在构建的平台,但我还是建议下载它

git clone https://github.com/tianocore/edk2.git -b"stable/202011"
git clone https://github.com/tianocore/edk2-platforms.git
git clone https://github.com/tianocore/edk2-non-osi.git
cd edk2 && git submodule update --init
cd ../edk2-platforms && git submodule update --init && cd ..

我们需要让EDK2的构建系统知道这些文件夹的位置。我们还将设置一些其他变量

export EDK_TOOLS_PATH="$PWD/edk2/BaseTools"
export PACKAGES_PATH="$PWD/edk2:$PWD/edk2-platforms:$PWD/edk2-non-osi"

我们现在必须设置环境

. edk2/edksetup.sh
make -C edk2/BaseTools

要在edk2-platforms中为某个平台构建,只需找到相关的.dsc文件。

构建EDK2 UEFI应用程序

一旦构建了EDK2的基础部分,构建UEFI应用程序就非常容易了。作为操作系统开发人员,主要的软件包将与MdeModulePkg一起工作,这是一个完整的UEFI封装库。
首先,我们必须创建一个包含应用程序的目录。我们将在主EDK2目录中创建它,如下所示:

cd edk2
mkdir MyEfiApp

现在,在MyEfiApp目录下创建一个名为MyEfiApp.inf的文件。内容如下:

[Defines]
  INF_VERSION = 1.25
  BASE_NAME = MyEfiApp
  FILE_GUID = # Get a GUID from guidgen.com
  MODULE_TYPE = UEFI_APPLICATION
  VERSION_STRING = 1.0
  ENTRY_POINT = UefiEntry
 
[Sources]
  UefiMain.c
 
[Packages]
  MdePkg/MdePkg.dec
 
[LibraryClasses]
  UefiApplicationEntryPoint
  UefiLib
 
[Guids]
 
[Ppis]
 
[Protocols]
 
[FeaturePcd]
 
[Pcd]

注意:上面的FILE_GUID不能空,否则编译时报错。具体填什么值可以从其他.inf文件中参考下。

在和MyEfiApp.inf同一个目录MyEfiApp中创建一个名为UefiMain.c的文件。并赋予它以下内容:

#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
 
EFI_STATUS EFIAPI UefiEntry(IN EFI_HANDLE imgHandle, IN EFI_SYSTEM_TABLE* sysTable)
{
    gST = sysTable;
    gBS = sysTable->BootServices;
    gImageHandle = imgHandle;
    // UEFI apps automatically exit after 5 minutes. Stop that here
    gBS->SetWatchdogTimer(0, 0, 0, NULL);
    Print(L"Hello, world!\r\n");
    // Allocate a string
    CHAR16* str = NULL;
    gBS->AllocatePool(EfiLoaderData, 36, (VOID**)&str);
    // Copy over a string
    CHAR16* str2 = L"Allocated string\r\n";
    gBS->CopyMem((VOID*)str, (VOID*)str2, 36);
    Print(str);
    gBS->FreePool(str);
    return EFI_SUCCESS;
}

如果需要,现在运行 . edksetup.sh  。然后,在MdeModulePkg/MdeModulePkg.dsc找到“Components”部分,然后加上这个

[Components]
  ...
  MyEfiApp/MyEfiApp.inf

之后,像这样调用EDK2的构建系统来构建MyEfiApp:

build -a X64 -t GCC5 -p MdeModulePkg/MdeModulePkg.dsc

-a指定目标平台,可以指定为:IA32, X64, AARCH64, ARM 或者 RISCV64.

最后,在Build/MdeModule/DEBUG_GCC5/X64文件夹中,应该有一个名为MyEfiApp.efi的文件。

构建OVMF和ArmVirt

构建OVMF和ArmVirtPkg很容易,在设置EDK2之后,为OVMF运行以下命令:

build -a YOUR_ARCH -t GCC5 -p OvmfPkg/OvmfPkgYOUR_ARCH.dsc

对于OVMF, YOUR_ARCH只能是IA32或X64。对于ArmVirtPkg,运行这个:

build -a YOUR_ARCH -t GCC5 -p ArmVirtPkg/ArmVirtQemu.dsc

YOUR_ARCH只能是ARM或AARCH64。在此之后,固件将输出OVMF Build/OvmfYOUR_ARCH/DEBUG_GCC5/FV,或ArmVirtPkg Build/ArmVirtQemu-YOUR_ARCH/DEBUG_GCC5/FV。

本文参考:

https://wiki.osdev.org/EDK2

https://wiki.osdev.org/GNU-EFI

https://kcm.trellix.com/corporate/index?page=content&id=KB90801&locale=en_US

标签:ubuntu20.04,git,EDK2,edk2,构建,UEFI,MyEfiApp,搭建
From: https://www.cnblogs.com/wanglouxiaozi/p/17881933.html

相关文章

  • 5秒成为AI产业顾问、营销BI轻松搭建......一封来自星河社区5周年产业特辑的信
    亲爱的星河社区企业伙伴:这一年,大模型技术为产业应用带来了范式的变革。有幸的是,我们与众多生态企业一起,共同经历了这一在时代中留下烙印的历史进程。自星河社区发布了大模型开发工具ERNIEBotSDK,我们与紧跟创新趋势的企业伙伴联合更为紧密。我们一起通过分享最新的AI应用趋势、探......
  • uni-app 基础架构搭建 ts+vue3 命令行
    1. 安装全局degitnpminstall-gdegit2.创建工程my-vue3-ts-project#创建以javascript开发的工程npxdegitdcloudio/uni-preset-vue#vitemy-vue3-ts-project#创建以ts开发的工程npxdegitdcloudio/uni-preset-vue#vite-tsmy-vue3-ts-project3进入目录cdmy-v......
  • 简易计算机的搭建
    简易计算机的搭建1、一些无关紧要的前置知识​ 现代计算机类设备的主流架构一般有两种:一为冯诺依曼体系架构;一为哈弗架构。​ 主流计算机采用的架构一般为冯诺依曼体系,是将程序和数据放在一起存储的架构;​ 单片机设备一般采用哈弗架构,是将程序与数据分开存储的一种架构。​ ......
  • 搭建Windows风格的个人网盘,支持文档在线编辑
    这是一个Windows页面风格的个人网盘,支持普通文本、文档、表格、xmind等在线编辑,支持Windows的小组件,例如计算器、WhiteBoard、python等,其他更多功能待你来发现,也待你来开发。为什么要做这个网盘?因为现在的商用网盘收费太高,个人文件存在别人的服务器上也不安全。而现在一些开源......
  • Kali搭建DVWA过程(Web靶场)的问题总结
    一、kali安装谷歌拼音1.需要先获得root权限:通过su命令,输入密码2.获得权限后,安装输入法框架aptinstallfcitx3.安装Googel拼音输入法命令aptinstallfcitx-googlepinyin4.输入法安装完成后,搜索框打开Fcitx配置,将安装的Googel拼音输入法排序为第一位5.终端reboot重启,c......
  • Devops - 使用gogs搭建企业内部git服务器
    Gogs是一款极易搭建的自助Git服务,使用Go语言开发使得Gogs能够通过独立的二进制分发,并且支持Go语言支持的所有平台。1.运行gogs的准备工作创建运行gogs应用的linux用户#创建gogs用户sudouseradd-mgogs#设定密码sudopasswdgogs配置数据库(mysql)#......
  • 【自己搭建一个:端到端的语音+大模型聊天机器人】
    概要发篇文章记录一下最近搞的语音+大模型聊天机器人的搭建过程,供交流学习。有正反馈的话会继续优化。整体架构流程注意:借传统的基于RASA的对话机器人的图一用,本博会把NLU(NaturalLanguageUnderstanding)和DialogueManagement这两个组件,用大模型来替代。组件及模型说明:用......
  • 大模型环境搭建(二)
    二:Conda安装1.下载链接:https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe2.安装完之后,要修改以下他的执行策略!点开始菜单,打开:AnacondaPowershellPrompt(miniconda3)然后输出以下内容,然后输入大写“A”回车确认:Set-ExecutionP......
  • day 01 计算机基础和环境搭建
    1.计算机基础1.1基本概念计算机的组成计算机是由多个硬件组合而成,常见的硬件有:CPU、硬盘、内存、网卡、显示器、机箱、电源...操作系统用于协调计算机的各个硬件,让硬件之间协作工作,以完成某个目标-Windows-Linux-Mac软件在安装上操作系统之后,我们会在自己电......
  • 低代码开发实践:从零开始搭建一个库存管理系统
    本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。I.引言低代码开发是一种软件开发方法论,旨在通过减少手动编写代码的工作量,加快应用程序的开发速度和交付时间。它基于图形化的界面和可视化工具,使开发者能够......