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

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

文章目录

  • 基于QEMU-aarch64学习UEFI(EDK2)-1环境搭建
    • 一、环境搭建
      • 1、虚拟机Ubuntu系统安装
      • 2、docker镜像导入
      • 3、下载EDK2源码
      • 4、容器创建和代码编译
        • 4.1 容器创建
        • 4.2 代码编译
      • 5、运行QEMU_EFI.fd
      • 6、VSCODE配置
      • 7、日常工作
      • 8、不同项目的处理方法
      • 9、submodules的处理
      • 10、Ubuntu安装软件环境

一、环境搭建

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 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环境已经搭建完成,后续进行程序开发学习。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——二叉树与堆

作者:几冬雪来 时间: 内容:二叉树与堆内容讲解 目录 前言: 1.完全二叉树的存储: 2.堆的实现: 1.创建文件: 2.定义结构体: 3.初始化结构体: 4.扩容空间与扩容…

学习黑客十余年,如何成为一名高级的安全工程师?

1. 前言 说实话,一直到现在,我都认为绝大多数看我这篇文章的读者最后终究会放弃,原因很简单,自学终究是一种适合于极少数人的学习方法,而且非常非常慢,在这个过程中的变数过大,稍有不慎&#…

win32api之文件系统管理(七)

什么是文件系统 文件系统是一种用于管理计算机存储设备上文件和目录的机制。文件系统为文件和目录分配磁盘空间,管理文件和目录的存储和检索,以及提供对它们的访问和共享,以下是常见的两种文件系统: NTFSFAT32磁盘分区容量2T32G…

C/C++之while(do-while)详细讲解

目录 while循环有两个重要组成部分: while 是一个预测试循环 无限循环 do-while 循环 while循环有两个重要组成部分: 进行 true 值或 false 值判断的表达式;只要表达式为 true 就重复执行的语句或块;图 1 显示了 while 循环的…

GIS开源库GEOS库学习教程(一):编译及示例代码

1、介绍 GEOS库是一个集合形状的拓扑关系操作实用库,简单得说,就是判断两个几何形状之间关系和对两个几何形状进行操作以形成新的几何形状的库。GEOS是仿照JTS库做的,是JTS的C实现。下面是JTS Topology Suite (JTS) 拓扑运算函数库的介绍&…

Android 自定义View 之 Mac地址输入框

Mac地址输入框前言正文一、什么是View?二、什么是自定义View三、自定义View① 构造方法② XML样式③ 测量④ 绘制1. 绘制方框2. 绘制文字⑤ 输入1. 键盘布局2. 键盘接口3. 键盘弹窗4. 显示键盘5. 处理输入四、使用自定义View五、源码前言 在日常工作开发中,我们时长…

Ubuntu下载、配置、安装和编译opencv

1 安装相关依赖安装opencv前,需要先准备好编译器、相关依赖sudo apt-get install gcc g cmake vim sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev sudo apt-get install libgtk2.0-…

MySQL数据库实现主从同步

安装MySQL数据库8.0.32 前言 今天来学习数据库主从同步的原理及过程,数据库主要是用来存储WEB数据,在企业当中是极为重要的,下面一起来看下。 1.1 数据库做主从的目的 MySQL主从复制在中小企业,大型企业中广泛使用&#xff0c…

类和对象 - 下

本文已收录至《C语言》专栏! 作者:ARMCSKGT 目录 前言 正文 初始化列表 成员变量的定义与初始化 初始化列表的使用 变量定义顺序 explicit关键字 隐式类型转换 自定义类型隐式转换 explicit 限制转换 关于static static声明类成员 友元 友…

重构类关系-Push Down Method函数下移四

重构类关系-Push Down Method函数下移四 1.函数下移 1.1.使用场景 超类中的某个函数只与部分(而非全部)子类有关。将这个函数移到相关的那些子类去。 Push Down Method (328)与Pull Up Method (322)恰恰相反。当我有必要把某些行为从超类移至特定的子…

maven的profiles功能介绍、maven自定义插件plugin

profiles maven配置文件的profiles功能类似于springboot的spring.profiles.active配置&#xff0c;指定不同的环境来读取相应的配置内容。 <profiles>标签的子标签可以包含<repository> <plugin> <dependencies> <distributionManagement>等。 …

go语言gin框架学习

让框架去做http解包封包等&#xff0c;让我们的精力用在应用层开发 MVC模式 M: model&#xff0c;操作数据库gorm view 视图 处理模板页面 contoller 控制器 路由 逻辑函数 解决gin相关代码飘红的问题 记得启用gomodule go env -w GO111MODULEon然后到相应目录下执行 go mod i…

Karl Guttag:论相机对焦技术在AR/VR中的沿用

近期&#xff0c;AR/VR光学专家Karl Guttag介绍了两家在CES 2023展出光学传感技术的公司&#xff1a;poLight和CML&#xff08;剑桥机电一体化&#xff09;。​同时介绍两家公司的原因&#xff0c;是因为他们提供了实现AR/VR“光学微动”&#xff08;Optics Micromovement&…

5.多线程学习

作者&#xff1a;爱塔居 专栏&#xff1a;JavaEE 作者简介&#xff1a;大三学生&#xff0c;喜欢总结与分享~ 文章目录 目录 文章目录 章节回顾 一、wait 和notify 二、设计模式 2.1 单例模式 章节回顾 线程安全 1.一个线程不安全的案例&#xff08;两个线程各自自增5w次&…

PyTorch 之 基于经典网络架构训练图像分类模型

文章目录一、 模块简单介绍1. 数据预处理部分2. 网络模块设置3. 网络模型保存与测试二、数据读取与预处理操作1. 制作数据源2. 读取标签对应的实际名字3. 展示数据三、模型构建与实现1. 加载 models 中提供的模型&#xff0c;并且直接用训练的好权重当做初始化参数2. 参考 pyto…

【Linux】基于阻塞队列的生产者消费者模型

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;为何要使用…

谈谈低代码的安全问题,一文全给你解决喽

低代码是一种软件开发方法&#xff0c;通过使用图形化用户界面和可视化建模工具&#xff0c;以及自动生成代码的技术&#xff0c;使得开发人员可以更快速地构建和发布应用程序。 作为近些年软件开发市场热门之一&#xff0c;市面上也涌现了许多低代码产品&#xff0c;诸如简道云…

SpringCloud:统一网关Gateway

目录 1、网关介绍 2、搭建网关服务 3、路由断言工厂 4、路由过滤器 5、全局过滤器GlobalFilter 6、过滤器执行顺序 7、跨域问题处理 1、网关介绍 网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连&#xff0c;是复杂的网络互 连设备&#xff0…

常见背包问题

一.前言若你想学习或正在学习动态规划&#xff0c;背包问题一定是你需要了解的一种题型&#xff0c;并且大多数人最初都是从背包问题入坑进而打开动态规划这一大门。背包问题分为多种&#xff0c;你可以先掌握最常见的主要是三类&#xff1a;01背包、完全背包、多重背包二.分析…

C语言--动态内存管理1

目录前言动态内存函数介绍mallocfreecallocrealloc常见的动态内存错误对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存忘记释放&#xff08;内存泄漏&#xff09;对通讯…