arm 安装git_UEFI开发探索56-使用WSL编译Arm架构的UEFI镜像

2023-05-16

(请保留->作者:罗冰 原始发布的博客地址:https://blog.csdn.net/luobing4365)

这篇本想讨论USB的,学习过程中不小心迷上了WSL,又正好想在树莓派上折腾点UEFI的软件,顺理成章地就用WSL搭建了Arm架构的编译环境。

从结论来说,还不错,省得打开虚拟机了,编译速度也很快,有空把X86架构的编译环境也在WSL上搭建起来。

1 搭建WSL

个人比较喜欢用Ubuntu18.04,很多软件都在上面写的。搭建方法就不具体描述了,可以参考我的另外一篇博客:

https://blog.csdn.net/luobing4365/article/details/105752549

2 所需下载的代码

可以从github的仓库上下载以下开源代码,准备用来搭建开发环境。不过,github像乌龟一样的速度,如果不是为了修心养性,还是建议用gitee来下载。至于如何将github的库转到gitee上,同样可以参考我之前写的博客:

http://yiiyee.cn/blog/2020/04/21/%e4%bd%bf%e7%94%a8gitee%e4%b8%8b%e8%bd%bdgithub%e9%a1%b9%e7%9b%ae/

或者https://blog.csdn.net/luobing4365/article/details/105658274

1) edk2 仓库tianocoreedk2 仓库地址:https://github.com/tianocore/edk2.git
这是包含固件开发环境的仓库,编译UEFI固件所需要的库都在其中。2) edk2-platforms 仓库:tianocoreedk2-platforms
仓库地址:https://github.com/tianocore/edk2-platforms.git
各种平台的工作环境和相关的模块3) ACPICA 仓库acpicaacpica 仓库地址:https://github.com/acpica/acpica.git
ACPI组件框架(ACPI Component Architecture)工具,提供开源的iASL编译工具。
后面的这个是非必需的,不过建议下载,编程比较方便。4) edk2-libc 仓库:tianocoreedk2-libc
仓库地址:https://github.com/tianocore/edk2-libc.git
UEFI下的StdLib库,可以使用C标准库进行UEFI的编程。

打开WSL(我的环境是Ubuntu18.04),建立工作目录,比如取名为MyWorkspce。并把上述需要的仓库代码git到本地,示例如下:

$ mkdir Myworkspace
$ git clone –recursive https://github.com/tianocore/edk2.git
$ git clone https://github.com/tianocore/edk2-platforms.git
$ git clone https://github.com/acpica/acpica.git

如需要编译使用StdLib库的程序,把edk2-libc库也git下来:

$ git clone https://github.com/tianocore/edk2-libc.git

下载后,我的目录夹如下所示:

图1 EDK2的工作目录

3 安装编译所需工具

编译所需的工具如下:

1) Python2.7/Python3 Python解释器,我使用的是Python3;
2) uuid-dev 需要头文件uuid/uuid.h;
3) build-essential 包含make、gcc、g++等工具;
4) bison 词法生成器,用于GNU编译工具包的语法生成,acpica工具需要它;
5) flex 词法分析器,acpica工具需要它;

安装命令如下:

$ sudo apt install bison build-essential flex uuid-dev
$ sudo apt install python3 python3-distutils

检查安装的工具,在我的环境中是这样的:

$ make -v
GNU Make 4.1
$ gcc –version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
$ g++ –version
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
$ python3 -V
Python 3.6.9

4 Arm跨平台编译工具链

在x86_64-linux上,可编译aarch64-elf的跨平台工具链可以这里下载:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads。

可选择最新的编译器下载,带有’AArch64 ELF bare-metal target (aarch64-elf)’字样的是我们所需要的,注意是x86_64 Linux为host。

比如可以下载这个:gcc-arm-8.2-2019.01-x86_64-aarch64-elf.tar.xz,下载地址为https://developer.arm.com/-/media/Files/downloads/gnu-a/8.2-2019.01/gcc-arm-8.2-2019.01-x86_64-aarch64-elf.tar.xz。

在工作目录下建立文件夹toolchain,如图1,把跨平台编译解压到此处。

$ cd toolchain
$ tar xf gcc-arm-8.2-2019.01-x86_64-aarch64-elf.tar.xz

5 准备acpica工具和BaseTools

进入工作目录,编译acpica工具

$ make -C acpica/

在工作目录下,新建myexport.sh的批处理文件,写入如下内容:

export WORKSPACE=$PWD
export GCC5_AARCH64_PREFIX=$PWD/toolchain/gcc-arm-8.2-2019.01-x86_64-aarch64-elf/bin/aarch64-elf-
export PACKAGES_PATH=$PWD/edk2:$PWD/edk2-platforms:$PWD/edk2-libc
export IASL_PREFIX=$PWD/acpica/generate/unix/bin/
export PYTHON_COMMAND=/usr/bin/python3

将此批处理文件设置为可执行(chmod +x),然后编译BaseTools工具集:

$ source ./myexport.sh
$ source edk2/edksetup.sh
$ make -C edk2/BaseTools

6 编译所需要的固件和UEFI程序

为FVP AEMv8A平台编译固件:

$ build -a AARCH64 -t GCC5 -p edk2-platforms/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc -b DEBUG

为Arm Juno平台编译固件:

$ build -a AARCH64 -t GCC5 -p edk2-platforms/Platform/ARM/JunoPkg/ArmJuno.dsc -b DEBUG

我自己建立的、常用的包RobinPkg,将其拷贝到edk2-libc目录下,也可以编译里面的代码了,比如:

$ build -a AARCH64 -t GCC5 -p edk2-libc/RobinPkg/RobinPkg.dsc -m edk2-libc/RobinPkg/Applications/Luo2/Luo2.inf

所有生成的文件都在工作目录下的Build文件夹中。


补充一个小故事。

昨天下午,和同事调试飞腾的问题,我们想把现有的UEFI代码移植到飞腾FT-2000的平台上。

调试到一半,接到报告说,在UEFI driver中,PCIIO的protocol调用,放在mian函数中能正常工作;另外写了个函数,把这个调用放在函数中,由main函数调用,就无法正常工作了。

???,还有这种事?!

我看了下调试现场,还确实是。再看代码,读了几分钟,也看不出什么错误。

一瞬间,冒出了各种想法:驱动的回调函数在不同阶段被调用,全局变量在栈上被清除了?调用过程中,被其他事件打断,用了核心变量?……

尝试着把核心变量的地址和值打印出来,也没有错。

那种心情到现在我还记得非常清楚,好像之前搭建的对计算机的理解、对语言的理解、对UEFI体系的理解,在逐渐解体,出现裂痕,开始崩塌…

我实在无法理解,同样的调用,加一层函数就无法工作了?

兴趣突然高涨,我一定要找到我理解的盲点。抛弃看到的代码,根据需要的功能,自己重新实现了一遍。

编译,没有出错;找U盘拷贝文件,开机运行;进入UEFI Shell,加载执行:

工作正常!

想象中的大厦好像开始自动弥补裂缝,重新站好了。

还是同事眼神好,比较了新写的代码和原来的代码,发现某个参数多加了取值符,导致存入的位置全是错的。

在这个小插曲后,终于解决了飞腾遇到的所有设备访问问题,后续只要继续构建代码,调整细节就可以了。

感谢飞腾的张老师、合作厂商的兄弟以及这两周陪着我们调试的外协兄弟们!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

arm 安装git_UEFI开发探索56-使用WSL编译Arm架构的UEFI镜像 的相关文章

随机推荐

  • python获取windows进程cpu占用率_用Python计算进程cpu使用率

    经过进一步的研究 xff0c 我找到了解决办法 在 因此 xff0c 为了获得进程cpu使用率的百分比 xff0c 我们需要一些参数 xff1a 1 系统时间 为了计算这个 xff0c 我们需要用户模式时间 xff0c 内核模式时间和 空闲
  • Proxmox生产实践点滴:硬件篇

    总体上来说 xff0c Proxmox VE并不挑剔硬件 xff0c 其目前使用的Linux内核来自ubuntu 16 04 LTS发行版 xff0c 内核版本号为4 4 x 应该算是相当新的了 xff0c 确保对新硬件的兼容性 xff0c
  • Python基础——面向对象

    面向过程适合思考小规模事情 面向对象适合思考大规模的事情 思维 xff1a 先判断事情是简单的 小规模的 xff0c 还是复杂 的 xff0c 大规模的 xff0c 然后选择不同的思维方式 遇到复杂问题 xff0c 先从问题中找名词 xff
  • fdisk找不到u盘_U盘装电脑系统两个常见问题及解决方法

    如今电脑装机 xff0c 不管是电脑店还是用户自己装机 xff0c 估计95 以上是选用U盘一键装机 xff0c 网上流行的老毛桃 大白菜 小白等等很多 xff0c 这些系统大同小异 xff0c 运行装机系统 xff0c 然后根据自己需要
  • c++ gdi修改dpi_SV DPI-C接口学习心得

    1 是什么 xff1f xff1f DPI Direct Programming Interface xff0c 全称直接编程接口 xff0c 是SV与其它语言 C C 43 43 交互的接口 xff0c 基本上是唯一接口了 2 为什么 x
  • linux系统盘快照回滚,使用Btrfs对Linux系统进行快照回滚方法

    Btrfs 又被称为 Butter FS Better FS 或 B Tree FS 是由 Oracle 于 2007 年开始设计 开发的一个现代文件系统 它于 2009 年开始便被合并入 Linux 2 6 29 内核 Btrfs 基于
  • vi删除选中内容_linuxvi怎么编辑器删除多行与复制命令

    vi vim是什么 Linux世界几乎所有的配置文件都是以纯文本形式存在的 xff0c 而在所有的Linux发行版系统上都有vi编辑器 xff0c 因此利用简单的文字编辑软件就能够轻松地修改系统的各种配置了 xff0c 非常方便 vi就是一
  • ios sdk 穿山甲_GitHub - ArthurKnight/flutter_ad_pangolin_plugin: iOS flutter 穿山甲插件

    Pangolin 前言 在使用本插件前请认真 xff0c 仔细阅读穿山甲官方文档 本插件将尽量保留SDK内容和各API相关内容 xff0c 如出现在官方文档以外报错信息可以留言issue 或通过文末联系方式联系作者 注明来意 针对你可能会遇
  • @Async 使用

    64 Async 用于异步式执行场景 作用于类和方法上 方法上使用较为常用 在Application类上加上 64 EnableAsync启动异步注解 然后在需要异步的方法或类上加上 64 Async就可以异步执行了 64 Async 使用
  • 七大设计原则

    1 开闭原则 xff08 Open Closed Principle xff0c OCP xff09 尽量通过扩展来面对需求的更改或者系统的变化 xff0c 尽量不要对原有内容修改 xff08 对新增开 xff0c 对修改闭 xff09 优
  • java 多线程的6种状态

    关于线程的生命周期 xff0c 网上书上说法不一 xff0c 难以统一 xff0c 本篇做一个总结 xff1a java lang Thread State 枚举类中定义了六种线程的状态 xff0c 可以调用线程Thread中的getSta
  • @Configuration 注解

    类名上加如入 64 Configuration 注解使得该类成为Spring的配置类 xff0c Spring在初始化时会扫描并加载该类 xff0c 通常搭配 64 Bean注解使用
  • Proxmox监视器

    Proxmox使用KVM虚拟机技术 在KVM虚拟机里 xff0c 所有部件都不是真实的物理部件 xff0c 而是用软件模拟出来的 CPU 内存 硬盘 网卡等等 xff0c 全部都经过了Qemu软件包装 用户一方面可以利用Qemu软件提供的监
  • @Bean注解

    64 Bean注解加在方法上使得对象交给Spring容器管理 xff0c 返回对类型为交给Spring容器管理的类名 xff0c 方法名为IoC的id xff0c 也可以指定id span class token comment 指定该cl
  • MarkDown基本语法

    标题 xff1a 一级标题为 xff0c 二级标题为 xff0c 以此类推 xff0c 最多6级标题 注意 后面有个空格 字体 xff1a 加粗 加粗字体 实际效果 xff1a 加粗字体 斜体 斜体 实际效果 xff1a 斜体 斜体加粗 斜
  • 没有dpkg命令_ffsend:在命令行中通过 FireFox Send 分享文件 | Linux 中国

    在过去我们已经写了多篇有关安全分享这个话题的文章 xff0c 今天我们甚至还将继续讨论这个话题 xff0c 我们将介绍名为 ffsend 的工具 Vinoth Kumar Linux 用户偏爱使用 scp 或 rsync 来进行文件或目录的
  • python下载视频you_python 视频下载神器(you-get)

    you get是github上python的一个开源库 https github com soimort you get xff0c 使用you get你只需要取得视频所在网页链接地址就可以很轻松的下载下来 xff0c 目前you get所
  • 如何正确运用计算机,如何正确使用电脑

    现在的电脑已经成为生活中不可或缺的一部分了 xff0c 那么如何正确使用电脑比较好呢 怎么样做才能使我们的电脑用久之后还能完美如新呢 以下是CN人才小编为您收集整理提供到的如何正确使用电脑 xff0c 欢迎阅读参考 xff0c 希望对你有所
  • opencv python考勤_Python opencv实现人眼/人脸识别以及实时打码处理

    利用Python 43 opencv实现从摄像头捕获图像 xff0c 识别其中的人眼 人脸 xff0c 并打上马赛克 系统环境 xff1a Windows 7 43 Python 3 6 3 43 opencv 3 4 2 一 系统 资源准
  • arm 安装git_UEFI开发探索56-使用WSL编译Arm架构的UEFI镜像

    请保留 gt 作者 xff1a 罗冰 原始发布的博客地址 xff1a https blog csdn net luobing4365 这篇本想讨论USB的 xff0c 学习过程中不小心迷上了WSL xff0c 又正好想在树莓派上折腾点UEF