基于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 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/opensslurl = https://gitee.com/rayu/openssl[submodule "SoftFloat"]path = ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3url = https://gitee.com/rayu/berkeley-softfloat-3.git[submodule "UnitTestFrameworkPkg/Library/CmockaLib/cmocka"]path = UnitTestFrameworkPkg/Library/CmockaLib/cmockaurl = https://gitee.com/liuson945/edk2-cmocka.git[submodule "MdeModulePkg/Universal/RegularExpressionDxe/oniguruma"]path = MdeModulePkg/Universal/RegularExpressionDxe/onigurumaurl = https://gitee.com/rayu/oniguruma[submodule "MdeModulePkg/Library/BrotliCustomDecompressLib/brotli"]path = MdeModulePkg/Library/BrotliCustomDecompressLib/brotliurl = https://gitee.com/rayu/brotli[submodule "BaseTools/Source/C/BrotliCompress/brotli"]path = BaseTools/Source/C/BrotliCompress/brotliurl = https://gitee.com/rayu/brotliignore = untracked^M[submodule "RedfishPkg/Library/JsonLib/jansson"]path = RedfishPkg/Library/JsonLib/janssonurl = https://gitee.com/jiego/jansson

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

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

[submodule "CryptoPkg/Library/OpensslLib/openssl"]path = CryptoPkg/Library/OpensslLib/opensslurl = https://gitee.com/rayu/openssl
[submodule "SoftFloat"]path = ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3url = https://gitee.com/rayu/berkeley-softfloat-3.git
[submodule "UnitTestFrameworkPkg/Library/CmockaLib/cmocka"]path = UnitTestFrameworkPkg/Library/CmockaLib/cmockaurl = https://gitee.com/liuson945/edk2-cmocka.git
[submodule "MdeModulePkg/Universal/RegularExpressionDxe/oniguruma"]path = MdeModulePkg/Universal/RegularExpressionDxe/onigurumaurl = https://gitee.com/rayu/oniguruma
[submodule "MdeModulePkg/Library/BrotliCustomDecompressLib/brotli"]path = MdeModulePkg/Library/BrotliCustomDecompressLib/brotliurl = https://gitee.com/rayu/brotli
[submodule "BaseTools/Source/C/BrotliCompress/brotli"]path = BaseTools/Source/C/BrotliCompress/brotliurl = https://gitee.com/rayu/brotliignore = untracked
[submodule "RedfishPkg/Library/JsonLib/jansson"]path = RedfishPkg/Library/JsonLib/janssonurl = https://gitee.com/jiego/jansson[submodule "UnitTestFrameworkPkg/Library/GoogleTestLib/googletest"]path = UnitTestFrameworkPkg/Library/GoogleTestLib/googletesturl = 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环境已经搭建完成,后续进行程序开发学习。

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

  1. linux下安装EDK2开发环境,EDK2开发环境搭建 - osc_y9wmeuxa的个人空间 - OSCHINA - 中文开源技术交流社区...

    EDK2开发环境搭建 来源 https://blog.csdn.net/rikeyone/article/details/80759724 EDK2全称为"uEFI Development ...

  2. #大数据技术#基于python的hadoop(单机)环境搭建及使用

    基于python的hadoop(单机)环境搭建及使用 0.写在前面 1.虚拟机安装centos6.5 1.1安装流程 1.1.1系统安装 1.1.2修改静态ip(超级用户) 1.1.3更换可用源(超级 ...

  3. Ubuntu下基于 Cilium CNI 的 Kubernetus集群环境搭建

    Ubuntu下基于 Cilium CNI 的 Kubernetus集群环境搭建 1. 前言 2. 安装三个Ubuntu 2.1 三个机器都关闭防火墙 2.2 三个机器都关闭swap 2.3 三个机器都 ...

  4. DL之IDE:深度学习之计算机视觉开发环境搭建的详细流程(Ubuntu16.04+cuda9.0+cuDNN7.4.2+tensorflow_gpu)

    DL之IDE:深度学习之计算机视觉开发环境搭建的详细流程(Ubuntu16.04+cuda9.0+cuDNN7.4.2+tensorflow_gpu) 目录 1.安装nvidia驱动 2.安装CUDA ...

  5. 基于Spark的机器学习实践 (三) - 实战环境搭建

    0 相关源码 1 Spark环境安装 ◆ Spark 由scala语言编写,提供多种语言接口,需要JVM ◆ 官方为我们提供了Spark 编译好的版本,可以不必进行手动编译 ◆ Spark安装不难,配 ...

  6. OpenCV学习1--介绍与环境搭建

    OpenCV学习1--介绍与环境搭建 PS:安装过程中的一些总结和教训 安装文件夹里的V11对应的是VS2012版本,V14对应的是VS2015版本,所以使用VS2012的人可能无法使用opencv3 ...

  7. Ionic 学习笔记之-痛彻心扉的环境搭建

    Ionic 学习笔记之-痛彻心扉的环境搭建 最近在学习Ionic 做多平台的应用.跨平台应用.就是用html写的界面.js实现逻辑. 在学ionic之前选了各种跨平台APP开发框架.最后选择了ioni ...

  8. OpenGL学习笔记(一):环境搭建、三维空间坐标系理解以及OpenGL的基本使用

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7866 ...

  9. 【Linux集群基础环境搭建】基于虚拟机的多节点Linux网络环境搭建(超详细)

    基于VMWare虚拟机的多节点Linux网络环境搭建 一.使用工具 二.方案设计 三.实现过程 1.安装VMWare虚拟机软件 2. 创建虚拟机节点controller并安装CentOS 3. 通过节 ...

最新文章

  1. 干货 | 谷歌BERT模型fine-tune终极实践教程
  2. 菜鸟发现--网站的皮肤 ^_^
  3. 【HDU4507】恨7不成妻
  4. Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说
  5. 如何使用加密的Payload来识别并利用SQL注入漏洞
  6. react 消息队列_具有AkkaReact流的React队列
  7. 自己开发的ASP.NET分页控件2.0 (Ling.Pager)
  8. 这里90%的程序员根本就不算程序员。
  9. CentOS GRUB引导错误无法进入系统解决办法
  10. SCCM部署前的IIS、WSUS等准备
  11. python_激光点云变换到图像平面
  12. Microsoft.ACE.OLEDB.12.0 读取混合列
  13. 基于J2EE规范的中间件——EJB开发实例2
  14. unable to find setter method for attribute:[commandName]
  15. httpclient使用代理ip
  16. python 期货现货差价监测_Python期货期权无风险套利监控升级版
  17. MOX:开创区块链通证参与电影融资的新篇章
  18. Redis和lua,锦上添花
  19. cesium实现动态圆效果之——螺旋圆
  20. 追风筝的人 第一章

热门文章

  1. 一篇了解ERP与CRM、MRP、PLM、APS、MES、WMS、SRM的关系
  2. windows文件鼠标右键添加工具快捷方式
  3. C语言-函数指针void(*)(void),通用函数指针void(*)()
  4. Python爬虫编程思想(70): 项目实战--抓取京东商城手机销售排行榜
  5. 设任意n个整数存放于数组A[1..n]中,试编写算法,将所有正数排在所有负数前面(要求:算法时间复杂度为O(n))。
  6. 基于TI AM5728(浮点双DSP C66x +双ARM Cortex-A15)的开发板
  7. 面向过程(POP)、面向对象(OOP)、面向接口(IOP)、面向切面(AOP)
  8. java spring常见问题
  9. hyper v设置虚拟机动态内存,内存最大最小值
  10. NB-Iot烟感03:感烟探测器原理图设计