M1 MacOs Big Sur 11.11版笔记本从购买以来,一直在探索各种开发环境,作为一个UEFI的爱好者,那么EDK2的开发环境当然首当其冲了。
前沿
作为一个长期发展且走在时代前沿的我们,首先你必须得知道目前的主流架构:
- ARM
- X86
- 外加我们国内自主程度最高,拥有自主指令集架构的LoongArch
无论什么架构没有操作系统及生态也成不了气候,而对于EDK2的开发环境恰恰建立在操作系统的编译环境之上,那么不得不了解各种架构体系以及系统版本下的编译规则了,这样我们才能玩转M1.
按照龙芯胡老师所说,可以很好概括目前世界上的计算机体系:
体系 | Silicon架构 | OS版本 |
---|---|---|
WIntel | X86 | Windows |
AA | Arm | Android |
其中M1也离不开其中,它属于Arm的Silicon架构,Os版本是基于Unix开发的MacOs,所以玩转M1就需要知道Arm版本的MacOs下的编译规则,也就是架构中基于GCC,LLVM,golang等整合的编译链了。
在此由于对XCODE不是特别了解,所以我们在MacOs下搭建了一个Ubuntu的虚拟机来搭建EDK2的开发环境,关于如何在M1上搭建Ubuntu虚拟机,见Arm版的M1芯片如何搭建Window虚拟机可知。
EDK2源码下载
UEFI是一个开源项目,相信UEFI工作者们比我了解的还多了,所以在这里我就不多说啦。
EDK2开源社区:https://github.com/tianocore/edk2
源码下载:git clone https://github.com/tianocore/edk2.git
UEFI社区:https://www.uefi.org/ 包含一些UEFI的SPEC规范,没事可以浏览一下。
Build in UEFI code directory
M1芯片是基于ARMv8架构的IP核,所以我们目的是编译出AARCH64架构的二进制,用M1上用qemu模拟出一个小坏境去执行。
EDK2 环境提供了一个专门针对Arm版本的QEMU去调试用的Pkg -> ArmVirtPkg/ArmVirtQemu.dsc
编译此Pkg的步骤及注意事项:
- 1) source edksetup.sh:主要配置一些环境变量,并将EDK2中BaseTools的Conf文件(build_rule tools_def等)基本EDK2编译环境配置好。
- 2) export GCC48_AARCH64_PREFIX=$PATH/aarch64-linux-gnu-:aarch编译器,这里指的就是本地编译器(非交叉编译),默认M1安装的是GCC9的编译器,在这里EDK2的环境是无法正常编译通过的,所以首先请卸载GCC-9,使用GCC-7编译器,sudo apt remove gcc-9,sudo apt install gcc-7,当你安装好后默认gcc命令即是gcc-7版本的了,这里一定要注意要不然后面就无法执行了。其实EDK2社区推荐我们使用GCC-5。
- 3) make -C BaseTools :编译EDK2的工具链,GCC-7正常通过(在这里g++也请同样使用g+±7,而非g+±9),在这里像nasm,acpi,uuid-dev等编译组件我就不多少了,相信UEFI的开发者都懂。
- 4) build -a AARCH64 -t GCC48 -p ArmVirtPkg/ArmVirtQemu.dsc:当你的BaseTools正常编译通过,且GCC48_AARCH64_PREFIX这个环境变量正常指向了AARCH编译器,那我们就可以直接通过此命令来使用ArmVirtQemu来编译运行在QEMU上的AARCH架构的BIOS二进制了,最终生成的fd文件:Build/ArmVirtQemu-AARCH64/DEBUG_GCC48/FV/QEMU_EFI.fd
现在就已经是活的了,玩转UEFI的人应该比我懂,我就不在关羽面前耍大刀啦,请自行修改参与FD生成的模块及FD二进制的名字吧!
以上UEFI的AARCH架构的二进制就通过本地的AARCH编译器编译出来了,那么我们如何验证一下呢?
这就需要借助QEMU去模拟出一个AARCH’架构的处理器,如果你有开发版的话,请自行编译ArmPkg等,我这里没有,就只能用QEMU去模拟一个了。
QEMU模拟AARCH64
我没有使用现成的QEMU程序,QEMU是一个开源项目,按照源码可以从新编译。
QEMU源码下载:
QEMU社区源码:git clone https://github.com/qemu/qemu.git 请自行git。
QEMU源码编译:
我们最终需要编译出aarch执行的qemu-system-aarch64模拟AARCH64的模拟工具。
- 1 cd qemu-4.1.0
- 2 ./configure --target-list=aarch64-softmmu
这步骤可能会报一系列错误,除了缺包还是缺编译工具等…,所以需要耐心一点点排查并从中查找有效的安装包一个个安装,说一下我编译时所需要安装的一系列吧!
sudo apt-get install :
- libpixman-1-dev
- pkg-config
- libglib2.0-dev
- zlib1g-dev
- libtool
我只是为我们前进的路上排除了一丁点经验之谈,最终还是已你们本身的环境为主!
QEMU 编译好后会生成一个工具 qemu-system-aarch64:
有了模拟器,就可以模拟硬件环境执行我们的UEFI了.
QEMU模拟执行UEFI
工具使用命令: qemu-system-aarch64 -m 2048 -cpu cortex-a57 -smp 2 -vnc 0.0.0.0:1 -M virt -bios QEMU_EFI.fd -nographic,模拟一个a57的处理器,内存2G,双核,指定我们需要跑的BIOS程序QEMU_EFI.fd, 过多的参数就不详细说了!
执行结果:
其中qemu还可以通过qemu-img create aarm64.img来创建指定文件系统的磁盘以便跑内核等Os镜像。
希望大家多多分享,共同学习, 一代伟人曾说:数风流人物,还看今朝!加油吧,年轻人!