基于QEMU-aarch64学习UEFI(EDK2)-1环境搭建

11 篇文章 ¥9.90 ¥99.00
本文档详细介绍了如何在QEMU-aarch64环境中搭建UEFI(EDK2)的学习环境,包括Ubuntu虚拟机安装、docker镜像导入、EDK2源码下载、容器创建与代码编译、运行QEMU_EFI.fd、VSCODE配置以及日常工作的流程。特别强调了处理不同项目和submodules的方法,提供了一种高效的学习和开发方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于QEMU-aarch64学习UEFI(EDK2)-1环境搭建

一、环境搭建

1、虚拟机Ubuntu系统安装

虚拟机安装Ubuntu系统,如20.04,安装完系统后sudo apt-get install qemu*,用于安装qemu-system-aarch64应用程序。

2、docker镜像导入

系统安装完成后,如果没有docker请手动安装,安装完成后,输入以下命令,查看docker的容器和镜像,暂时是没有任何东西的。

下面导入我们之前编译的一个docker镜像,镜像包含了EDK2编译所需的软件。

导入我们的镜像,docker load -i rayuuu-edk2.tar
或者docker pull rayuuu/edk2:v1

在这里插入图片描述

导入完成,docker images命令可以看到我们刚刚导入的镜像。

docker镜像导入到这里,说明我们的软件环境已经搭建完成。

3、下载EDK2源码

软件环境搭建完成,下面开始下载源码,如果github下载速度慢,建议同步仓库到gitee上面再进行下载。。

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

在这里插入图片描述

下载完成后,我们继续克隆其他的仓库,如:edk2-platforms,edk2-libc,uefi-tools等仓库,命令如下:

git clone https://github.com/tianocore/edk2.git
git clone https://github.com/tianocore/edk2-platforms.git
git clone https://github.com/tianocore/edk2-libc.git
git clone https://github.com/tianocore/edk2-non-osi.git
git clone https://git.linaro.org/uefi/uefi-tools.git

在这里插入图片描述

克隆完成后,我们进入edk2,同步submodule。

cd edk2
git submodule update --init

然后checkout一个稳定的分支,如edk2-stable202208

git checkout -b edk2-rayu-202208 edk2-stable202208

在这里插入图片描述

4、容器创建和代码编译

4.1 容器创建

源码下载完成后,使用我们第二步导入的docker镜像,创建一个容器,开始尝试编译代码。

#docker run -h uefi --name uefistudy -p 2022:22 --privileged=true -v /work/study/uefistudy/edk2-202208:/data -it rayuuu/edk2:v1 bash
##命令解析如下:
docker run -h uefi \  #设置主机名称为uefi
--name uefistudy \  #设置容器名称为uefistudy
-p 2022:22 \  #端口映射,容器22端口映射到主机2022端口 docker不建议使用ssh,所以不用映射
端口
--privileged=true \  #使container内的root拥有真正的root权限
-v /work/study/uefistudy/edk2-202208:/data \   #数据映射,将主机work目录映射到容器data目录,可根据实际情况修改。
-it rayuuu/edk2:v1 bash

在这里插入图片描述

输入以上命令后,发现成功进入容器。

进入容器/data目录,查看我们映射的文件,已经存在。

在这里插入图片描述

4.2 代码编译

容器创建完成,下面开始编译QEMU,我们通过uefi-tools,首先配置uefi-tools工具。

编辑uefi-tools/edk2-build.sh,添加对应的路径。

在这里插入图片描述

然后使用该命令编译。

# armvirtqemu64是platforms名字
./uefi-tools/edk2-build.sh armvirtqemu64  -b DEBUG

提示没有权限。

在这里插入图片描述

输入命令sudo chmod a+rw /data,然后重新编译。

./uefi-tools/edk2-build.sh -b DEBUG armvirtqemu64

在这里插入图片描述

编译还是报错,退出,删掉容器,重新创建一个容器,以root用户登录。

docker run -h uefi --name uefistudy -p 2022:22 --privileged=true -uroot -v /work/study/uefistudy/edk2-202208:/home/edk2/src -it rayuuu/edk2:v1 bash

映射到/home/edk2/src路径,以root用户登录,重新编译,可以通过。

在这里插入图片描述

git status如果出现大量的修改,而且提示:

$ git diff code.c

old mode 100644

new mode 100755

那么使用命令:git config core.filemode false修改,此命令只针对当前仓库有效。

5、运行QEMU_EFI.fd

编译通过后,我们在Ubuntu系统下使用QEMU加载uefi固件。

在这里插入图片描述

在docker容器内,固件路径是/home/edk2/src/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd,那么在Ubuntu系统下的路径为/work/study/uefistudy/edk2-202208/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd

#qemu命令
qemu-system-aarch64 -machine virt,kernel_irqchip=on,gic-version=3 -cpu cortex-a57 -m 1G  \
 -device virtio-gpu-pci \
 -drive file=fat:rw:./filedir/,media=disk,if=virtio,format=raw -nodefaults  -device qemu-xhci -device usb-kbd \
 -bios `pwd`/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd \
 -serial stdio

上面命令使用qemu-system-aarch64程序,加载固件,将filedir文件夹映射到qemu中,实现文件共享。

我们使用上面命令运行我们刚刚编译的QEMU_EFI.fd,效果如下。

在这里插入图片描述

其中fs0:就是我们的filedir文件夹。

我们输入fs0:可以进入filedir查看文件。

在这里插入图片描述

其与我们在Ubuntu实际看到的文件一致。

在这里插入图片描述

6、VSCODE配置

我们这里以VSCODE为例,编辑代码,当然你也可以用vscode或者sublime代替。

在这里插入图片描述

这里推荐一个扩展,名字叫做edk2-vscode,对比sourceinsight可以实现FDF、DSC、DEC等文件跳转。

如果像*.dsc.inc,*.fdf.inc等文件无法识别的话,可以自己在"设置"->“文件”->"文件关联"中设置如下图:

将要识别的文件后缀名对应edk2_dsc,edk2_fdf

在这里插入图片描述

这样查看代码就会自动变色了。

在这里插入图片描述

7、日常工作

参考:韦东山——《嵌入式Linux应用开发完全手册V3.0_韦东山全系列视频文档-IMX6ULL开发板.docx》

假设你已经创建了容器,那么在日常工作中,你每天打开电脑后,你需要做的就是这个命令:

docker  start ubuntu     # 启动ubuntu容器
docker exec  -it ubuntu  bash # 进入容器,开始工作,可以在多个命令行中执行这命令
#在Ubuntu下,要先执行start 命令,它会启动SSH、NFS等服务
#在Ubuntu下,执行exit退出容器
docker  stop  ubuntu     # 停止容器,下班回家

我们查看我们创建的容器,docker ps -a命令。

在这里插入图片描述

我们这里可以重新命名,把CONTAINER ID自定义命名。

docker rename 8b7cf92dbd2d edk2

所以后续,我们每天开机就是docker start edk2来启动容器,然后进入容器编译。

在这里插入图片描述

8、不同项目的处理方法

针对不同的项目,也可以创建不同的容器,映射对应的代码文件夹即可,比如我们有一个project2的项目名称,那么我们新建一个project2的文件夹,把代码解压至project2中。

在这里插入图片描述

然后同步远程仓库,

git checkout master
git pull origin master

在这里插入图片描述

这时我们想同步最新的edk2-stable202211版本,发现没有同步到本地。

我们使用命令git fetch --tags -f,把远程tag同步过来。

在这里插入图片描述

接着创建远程tag edk2-stable202211为本地分支edk2-rayu-202211

命令如下:git checkout -b edk2-rayu-202211 edk2-stable202211

在这里插入图片描述

git log命令查看已经通过到最新的tag。

在这里插入图片描述

这样我们project2项目同步了最新的edk2-stable202211版本,我们下面创建project2的容器。

命令同之前创建容器一样,只是代码路径和端口不同:

docker run -h project2 --name project2 -p 2023:22 --privileged=true -uroot -v /work/study/project2/edk2-202211:/home/edk2/src -it rayuuu/edk2:v1 bash

在这里插入图片描述

进入容器,同样的编译方式,可以看到编译无问题。

9、submodules的处理

因为edk2里面包含了一些子模块,需要同步才能编译,上面演示是我已经把子模块下载完成了,同步到新的tag,我们需要再更新一次子模块。

由于网络原因,我把github的仓库导入到了gitee上面进行下载到本地,速度会快很多,下面是我的.gitmodules文件参考:

[submodule "CryptoPkg/Library/OpensslLib/openssl"]
     path = CryptoPkg/Library/OpensslLib/openssl
     url = https://gitee.com/rayu/openssl
 [submodule "SoftFloat"]
     path = ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3
     url = https://gitee.com/rayu/berkeley-softfloat-3.git
 [submodule "UnitTestFrameworkPkg/Library/CmockaLib/cmocka"]
     path = UnitTestFrameworkPkg/Library/CmockaLib/cmocka
     url = https://gitee.com/liuson945/edk2-cmocka.git
 [submodule "MdeModulePkg/Universal/RegularExpressionDxe/oniguruma"]
     path = MdeModulePkg/Universal/RegularExpressionDxe/oniguruma
     url = https://gitee.com/rayu/oniguruma
 [submodule "MdeModulePkg/Library/BrotliCustomDecompressLib/brotli"]
     path = MdeModulePkg/Library/BrotliCustomDecompressLib/brotli
     url = https://gitee.com/rayu/brotli
 [submodule "BaseTools/Source/C/BrotliCompress/brotli"]
     path = BaseTools/Source/C/BrotliCompress/brotli
     url = https://gitee.com/rayu/brotli
     ignore = untracked^M
 [submodule "RedfishPkg/Library/JsonLib/jansson"]
     path = RedfishPkg/Library/JsonLib/jansson
     url = https://gitee.com/jiego/jansson

而我对比最新的tag,即202211版本又新增了一个子模块,名称为googletest

在gitee上面搜索,发现有别人也同步了这个名为googletest的仓库,那么我参考修改一下,下面是最终的.gitmodules文件。

[submodule "CryptoPkg/Library/OpensslLib/openssl"]
    path = CryptoPkg/Library/OpensslLib/openssl
    url = https://gitee.com/rayu/openssl
[submodule "SoftFloat"]
    path = ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3
    url = https://gitee.com/rayu/berkeley-softfloat-3.git
[submodule "UnitTestFrameworkPkg/Library/CmockaLib/cmocka"]
    path = UnitTestFrameworkPkg/Library/CmockaLib/cmocka
    url = https://gitee.com/liuson945/edk2-cmocka.git
[submodule "MdeModulePkg/Universal/RegularExpressionDxe/oniguruma"]
    path = MdeModulePkg/Universal/RegularExpressionDxe/oniguruma
    url = https://gitee.com/rayu/oniguruma
[submodule "MdeModulePkg/Library/BrotliCustomDecompressLib/brotli"]
    path = MdeModulePkg/Library/BrotliCustomDecompressLib/brotli
    url = https://gitee.com/rayu/brotli
[submodule "BaseTools/Source/C/BrotliCompress/brotli"]
    path = BaseTools/Source/C/BrotliCompress/brotli
    url = https://gitee.com/rayu/brotli
    ignore = untracked
[submodule "RedfishPkg/Library/JsonLib/jansson"]
    path = RedfishPkg/Library/JsonLib/jansson
    url = https://gitee.com/jiego/jansson
 [submodule "UnitTestFrameworkPkg/Library/GoogleTestLib/googletest"]
    path = UnitTestFrameworkPkg/Library/GoogleTestLib/googletest
    url = https://gitee.com/zqx5449/googletest.git

然后更新子模块,命令git submodule update --init

在这里插入图片描述

10、Ubuntu安装软件环境

如果不想使用docker导入镜像的方式编译软件,那么可以在Ubuntu系统里面安装官方参考,使用apt-get命令安装。

比如:

sudo apt-get install -y bison build-essential uuid-dev iasl git gcc-5 nasm python3-distutils gcc-aarch64-linux-gnu

至此,我们在docker下编译EDK2环境已经搭建完成,后续进行程序开发学习。

<think>好的,用户的问题是关于在VSCode中配置和调试edk2开发环境。首先,我需要回忆一下EDK2是什么。EDK II是一个用于UEFI固件开发的开源项目,通常用于系统底层开发。用户可能在进行UEFI相关的开发工作,需要配置开发环境,并在VSCode中设置调试。 接下来,我需要考虑用户的具体需求。他们可能已经安装了EDK2,但不太清楚如何在VSCode中进行配置和调试。根据提供的引用,特别是引用[4]提到了创建project2的容器,可能涉及到容器化的开发环境。另外,引用[2]提到在VSCode中使用断点调试,特别是附加到Extension Host进程的方法,这可能与调试EDK2相关。 首先,我应该分步骤说明如何配置环境。包括安装必要的工具,如VS2019(引用[1]和[3]),Python,以及配置IASL、NASM等工具。需要确保这些工具的路径已经添加到系统环境变量中,这样VSCode才能找到它们。然后,配置VSCode的任务来编译EDK2项目,可能需要编写tasks.json文件,设置编译命令,比如build命令。 接下来是调试配置。EDK2的调试可能涉及到QEMU虚拟机,因此需要配置VSCode的launch.json,使用QEMU启动虚拟机并附加调试器。引用[2]中的附加到进程的方法可能适用,但需要具体针对EDK2的情况进行调整。可能需要使用GDB或者其他调试器来附加到QEMU实例。 还要注意用户提到的容器创建,引用[4]中的project2容器,可能需要配置Docker容器内的开发环境,这时候VSCode的远程容器扩展可能会有帮助。不过用户的问题更偏向于直接配置VSCode,所以可能需要分两种情况:本地配置和容器内配置。 另外,用户提供的引用中有关于环境变量配置和VS2019配置的内容,需要确保EDK2所需的工具链正确设置,比如可能需要VC编译器的路径,这涉及到引用[3]中的Visual Studio安装路径。同时,EDK2的编译可能依赖于特定的环境变量,如EDK_TOOLS_PATH,这些需要在VSCode中配置或者在终端中预先设置。 在生成相关问题的时候,需要考虑用户可能的后续疑问,比如如何优化编译速度,如何处理依赖问题,或者如何结合其他工具如QEMU进行调试。同时,用户可能会遇到断点无法命中或者调试器连接失败的问题,所以相关问题可以涉及调试技巧和常见错误的解决。 最后,确保所有步骤都符合用户提供的引用内容,并且正确标注引用来源。例如,在提到环境变量配置时引用[1],在调试部分引用[2],安装VS2019引用[3],容器配置引用[4]。</think>### 在 VSCode 中配置和调试 EDK2 开发环境的方法 #### 1. **基础环境准备** - **安装必要工具**: 根据 EDK2 的要求,需安装 Visual Studio 2019(C/C++ 编译支持)[^3]、Python、NASM、IASL 等工具,并配置环境变量[^1]。 ```bash # 示例:安装 Python 和 NASM(以管理员权限运行) choco install python nasm ``` - **同步 EDK2 代码**: 使用 Git 克隆 EDK2 仓库并初始化子模块: ```bash git clone https://github.com/tianocore/edk2.git cd edk2 && git submodule update --init ``` #### 2. **配置 VSCode 开发环境** - **安装扩展**: 安装 C/C++、Python 扩展,以及用于任务管理的插件(如 `Cortex-Debug` 或 `Native Debug`)。 - **配置编译任务**: 在 `.vscode/tasks.json` 中添加 EDK2 编译任务,例如: ```json { "label": "Build EDK2", "type": "shell", "command": "build", "args": ["-a", "X64", "-p", "ProjectPkg/ProjectPkg.dsc"] } ``` 通过 `Ctrl+Shift+B` 触发编译。 #### 3. **调试配置** - **使用 QEMU 启动虚拟机**: 在 `launch.json` 中配置 QEMU 调试会话,附加 GDB 调试器: ```json { "name": "Debug EDK2 with QEMU", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/Build/ProjectPkg/DEBUG_GCC5/X64/ProjectPkg.efi", "miDebuggerServerAddress": "localhost:1234", "setupCommands": [ { "text": "target remote localhost:1234" } ] } ``` 启动 QEMU 时需启用调试端口: ```bash qemu-system-x86_64 -s -S -bios path/to/OVMF.fd ``` - **断点调试技巧**: 在关键代码处设置断点,通过 `Attach to Extension Host` 模式附加到进程(参考引用[^2])。 #### 4. **容器化开发(可选)** 若使用容器(如 Docker),需在容器内同步 EDK2 代码并挂载到 VSCode 远程开发环境[^4]。 示例 Dockerfile 片段: ```dockerfile FROM ubuntu:20.04 RUN apt-get update && apt-get install -y build-essential nasm python3 ``` ####
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值