前言
因为之前一直有一个小想法,所以接触到了UEFI的知识点,所以就开始进行相关知识点的学习记录,当然最后的想法能不能成功倒是没有那么重要,最重要的还是能够从中学习到东西。因为全凭个人兴趣,所有的资料书写都来自书籍和实践,如有侵权,联系我删除。
另外因为兴趣使然,注定是随缘更新,也不知道会不会有人喜欢这个系列。
🧑🏻作者简介:一个设计转行计算机的年轻人
✨联系方式:最下面微信
⏳全文大约阅读时间: 60min
文章目录
环境说明
因为本人有wsl的环境,所以所有的环境搭建全部都在wsl下操作完成。不确定后期会不会切换,暂时从环境运行等情况来看,wsl22.04完全可以满足需求,如果不清楚wsl的安装可以看我这篇安装指南,如果遇到问题可以先看我的问题记录。
开发环境的安装
依赖安装
sudo apt install git python3 uuid-dev nasm bison flex build-essential
上面安装的文件都可以看到,其中git是非常常用的代码管理工具,大名鼎鼎的
GitHub
就是依托相关技术的产物,python3
是环境依赖,uuid-dev
包含了包含了编译的源文件,NASM
用来汇编X86,BISON
和FLEX
在编译ACPICA
作为依赖。build-essential
是开发运行的工具包,包含常用的gcc
、make
等工具。
源码下载
mkdir UEFIWorkspace cd UEFIWorkspace git clone https://github.com/tianocore/edk2 git clone https://github.com/tianocore/edk2-libc git clone https://github.com/acpica/acpica
经过上面的命令我们下载了三个git库,前两个是uefi编译的核心库,第三个是acpi编译的库。
注:博主玩过黑苹果,接触过acpi,黑苹果里电池修补就需要这个,其实就是BIOS提供给OS的接口。
配置开发环境
1.下载submodule
edk2有一些别的仓库的依赖,所以需要下载。需要
先进入edk2目录
然后执行下面的代码:~/UEFIWorkspace/edk2$ git submodule update --init
2.编译ACPICA
为了之后可以编译acpi,需要编译IASL编译器,其实也有发行版,但是编译的更靠谱。
~/UEFIWorkspace$ make -c ./acpica/
3.编译BaseTools
编译UEFI需要一些小工具,这个地方需要用源码编译一下。
~/UEFIWorkspace/edk2$ make -c BaseTools
4.设置开发环境
新建
envexport.sh
,内容如下export WORKSPACE=$PWD #设置工作目录 export PACKAGES_PATH=$PWD/edk2:$PWD/edk2-libc #设置edk2的依赖路径 export IASL_PREFIX=$PWD/acpica/generate/unix/bin/ #设置acpi编译器位置 export PYTHON_COMMAND=/usr/bin/python3 #设置python路径
其中
PWD
是linux的当前路径,也就说这个脚本执行只能在edk2上层。
编译UEFI模拟器和程序
编译UEFI模拟器
注:每次需要编译的时候这两句必须执行,否则会报错东西找不到!!!!
source envexport.sh source edk2/edksetup.sh
接下来开始编译模拟器:
build -p edk2/EmulatorPkg/EmulatorPkg.dsc -t GCC5 -a IA32 #编译32位模拟器 build -p edk2/EmulatorPkg/EmulatorPkg.dsc -t GCC5 -a X64 #编译64位模拟器
因为我本身就是64位平台,并且32不常用我就只编译了64位模拟器。
编译UEFI程序
编译UEFI包
build -p edk2-libc/AppPkg/AppPkg.dsc -t GCC5 -a X64
编译UEFI包里的程序(.efi)
build -p edk2/MdeModulePkg/MdeModulePkg.dsc -m edk2/MdeModulePkg/Application/HelloWorld/HelloWorld.inf -a X64 -t GCC5
使用模拟器运行
自带模拟器运行
我们可以用上面我们编译出来的编译器直接运行,运行方法如下:
cd Build/EmulatorX64/DEBUG_GCC5/X64 && ./Host
qemu运行
qemu是大名鼎鼎的模拟器,可以完全模拟一个真实的环境,当然还是有稍微的区别,但是做少量修改就可以放到真机执行。
先进行安装sudo apt install qemu
qemu运行的时候需要的是
OVMF镜像
,所以我们需要进行一下编译build -p edk2/OvmfPkg/OvmfPkgX64.dsc -t GCC5 -a X64 -b DEBUG
然后需要建立目录结构:
~/UEFIWorkspace$ mkdir _ovmf_dbg ~/UEFIWorkspace$ cd _ovmf_dbg/ ~/UEFIWorkspace/_ovmf_dbg$ cp ../Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd ./ ~/UEFIWorkspace/_ovmf_dbg$ mkdir hda-contents ~/UEFIWorkspace/_ovmf_dbg$ cp ../Build/OvmfX64/DEBUG_GCC5/X64/HelloWorld.* ./hda-contents/
然后就可以进行启动qemu:
qemu-system-x86_64 -s -pflash OVMF.fd -hda fat:rw:hda-contents/ -net none -debugcon file:debug.log -global isa-debugcon.iobase=0x402
真机运行
build -a IA32 -a X64 -p edk2/ShellPkg/ShellPkg.dsc -t GCC5 -b RELEASE
然后在Build/Shell/RELEASE_GCC5/
的IA32
和X64
文件下会有shel_xxxx.efi,拷到u盘(需要是FAT分区,FAt16或者FAT32都可以)中的efi\boot
目录下,命名为bootx32.efi
和bootx64.efi
就可以真机运行了。
总结
这次是开坑的文章,主要记录一下编译运行的过程,下一篇开始就进入正式的UEFI程序模块学习。