赞
踩
不是我不想更新博客,实在是没时间更新,一方面刚入职,公司有很多东西要学,另一方面,自己有很多坑没填完。最近在学习UEFI,先更新一波UEFI的学习过程。
我使用的教材是罗冰编写的《UEFI编程实践》以及《UEFI编程原理》,前者针对更新版本的UEFI进行编写,所以我主要参考《UEFI编程实践》进行环境搭建。
搭建的环境为:Vmware 15.0+Ubuntu 20.04 # 如果git速度慢可以输入下面的指令试一下, # git config --global url."https://hub.fastgit.org".insteadOf https://github.com 新建文件夹workspace: git clone https://github.com/tianocore/edk2.git git clone https://github.com/tianocore/edk2-libc.git git clone https://github.com/acpica/acpica.git 分别进入上面三个文件夹 输入:git submodule update --init 可能要安装一些依赖包 sudo apt install git python3 python3-distutils \ uuid-dev nasm bison flex sudo apt install gcc g++ build-essential qemu qemu-system 输入 gcc --version 和 make --version 有版本信息说明OK,下一步 回到workspace文件夹 输入make -C edk2/BaseTools 输入make -C acpica/ touch mybuild.sh | vim mybuild.sh 输入 #!/bin/bash export WORKSPACE=$PWD export PACKAGES_PATH=$PWD/edk2:$PWD/edk2-libc export IASL_PREFIX=$PWD/acpica/generate/unix/bin/ export PYTHON_COMMAND=/usr/bin/python3 保存 再sudo chmod a+x mybuild.sh #!!!!! 注意,EDK2上写的是支持GCC5, \ 而Ubuntu20.04自带的编译器是GCC9了 \ 为了不踩坑,我手动替换了GCC9 > GCC5 替换过程为如下: sudo vim /etc/apt/sources.list 在行末加入 # Ubuntu 16 deb http://mirrors.aliyun.com/ubuntu/ xenial main deb-src http://mirrors.aliyun.com/ubuntu/ xenial main deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main deb http://mirrors.aliyun.com/ubuntu/ xenial universe deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe deb http://mirrors.aliyun.com/ubuntu/ xenial-security main deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe 保存后输入sudo apt-get update apt install gcc-5 g++-5 添加gcc版本 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 40 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 50 切换gcc版本 sudo update-alternatives --config gcc 同理,将上诉gcc替换成g++,配置g++ 选择gcc和g++为版本5.4 这里环境配置就结束了
编译Emulator模拟器,Emulator可在Linux和win10上运行
在workspace文件夹下输入
source ./mybuild.sh
source edk2/edk2setup.sh
build -p edk2/EmulatorPkg/EmulatorPkg.dsc -a X64 -t GCC5
编译完成后进入
Build/EmulatorX64/DEBUG_GCC5/X64下输入
./Host
就可以启动Emulator&&UEFI了
编译
build -a X64 -t GCC5 -p edk2/OvmfPkg/OvmfPkgX64.dsc
运行
qemu-system-x86_64 -bios Build/OvmfX64/DEBUG_GCC48/FV/OVMF.fd -M pc -m 256 -cpu qemu64 -vga cirrus -name UEFI -boot order=dc
原因和GCC优化有关,指定 -O0即可
打开edk2/Conf/tool_def,把和我们相关的编译参数进行替换 -Os改为-O0
#DEFINE GCC_ALL_CC_FLAGS = -g -Os -fshort-wchar -fno-builtin -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -include AutoGen.h -fno-common
DEFINE GCC_ALL_CC_FLAGS = -g -O0 -fshort-wchar -fno-builtin -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -include AutoGen.h -fno-common
# DEBUG_GCC5_X64_CC_FLAGS = DEF(GCC5_X64_CC_FLAGS) -flto -DUSING_LTO -Os
DEBUG_GCC5_X64_CC_FLAGS = DEF(GCC5_X64_CC_FLAGS) -flto -DUSING_LTO -O0
# DEBUG_GCC5_X64_DLINK_FLAGS = DEF(GCC5_X64_DLINK_FLAGS) -flto -Os
DEBUG_GCC5_X64_DLINK_FLAGS = DEF(GCC5_X64_DLINK_FLAGS) -flto -O0
#RELEASE_GCC5_X64_CC_FLAGS = DEF(GCC5_X64_CC_FLAGS) -flto -DUSING_LTO -Os -Wno-unused-but-set-variable -Wno-unused-const-variable
#RELEASE_GCC5_X64_DLINK_FLAGS = DEF(GCC5_X64_DLINK_FLAGS) -flto -Os
RELEASE_GCC5_X64_CC_FLAGS = DEF(GCC5_X64_CC_FLAGS) -flto -DUSING_LTO -O0 -Wno-unused-but-set-variable -Wno-unused-const-variable
RELEASE_GCC5_X64_DLINK_FLAGS = DEF(GCC5_X64_DLINK_FLAGS) -flto -O0
再编译即可
1.注意是否指定为X64,IA32涉及到过多的依赖包配置,建议采用X64
2.有依赖包没装,自己百度搜一下缺的头文件,apt install xx即可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。