01.环境搭建-UEFI笔记

01.环境搭建-UEFI笔记

Table of Contents

UEFI环境搭建

1.软件安装

  • windows下
    • VSCODE
    • WSL (LINUX Ubuntu 24.04.2 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64))
  • 在Microsoft Store安装Ubuntu
  • vscode 安装wsl插件

2. 安装环境依赖

2.1 git安装

  • 打开Linux系统的终端,运行
sudo apt install git
git --version
  • 成功会输出git版本
    • git version 2.43.0

2. 按照python3

# 安装python3,一定要是 3.x.x 版本
sudo apt install python3
# 查看版本号确认安装成功
python3 --version
  • 输出结果

    • Reading package lists... Done
      Building dependency tree... Done
      Reading state information... Done
      python3 is already the newest version (3.12.3-0ubuntu2).
      python3 set to manually installed.
      The following package was automatically installed and is no longer required:
        libwrap0
      Use 'sudo apt autoremove' to remove it.
      0 upgraded, 0 newly installed, 0 to remove and 121 not upgraded.
      root@Crypto:~# python3 --version
      Python 3.12.3
      
  • 由于Linux系统自带了一个python2,所以还要建立python3与python的软链接,否则python命令还是调用的python2,只能用python3命令调用,会导致edk2编译失败。

    • 找到python软连接的位置 ( /usr/bin/ )

    • 删除旧的python软连接

      • # 打开终端,进入管理员模式
        sudo -i
        # 进入目标文件夹
        cd /usr/bin/
        # 删除python软连接
        sudo rm -rf python
        
    • 构建新的python软连接

      • # 与python3.6建立软连接
        sudo ln -s /usr/bin/python3.6 /usr/bin/python
        # 验证输出
        python --version
        

(注)WSL 的 Ubuntu 子系统中启用图形化界面

  • 如果你使用的是 Windows 11 及以上版本:

    1. 确保你的 WSL 和 Ubuntu 是最新版本
      • 打开 PowerShell 并运行 wsl --update 来更新 WSL 到最新版本。
      • 更新你的 Ubuntu 发行版:在 WSL 中运行 sudo apt update && sudo apt upgrade
    2. 安装 GUI 应用程序
      • 安装你想要使用的任何 GUI 应用程序。例如,要安装 Gedit 文本编辑器,可以在 WSL 终端中输入 sudo apt install gedit
    3. 启动 GUI 应用程序
      • 直接在 WSL 终端中输入应用程序名称(如 gedit),然后按回车键。如果一切配置正确,GUI 应用程序应该会在 Windows 桌面上弹出。

    如果你使用的是不支持 WSLg 的旧版本 Windows 或者希望手动配置:

    1. 安装一个 X Server

      • 在 Windows 上安装一个 X Server,比如 VcXsrv 或 Xming。
    2. 配置 DISPLAY 环境变量

      • 在 WSL 中设置 DISPLAY 环境变量。你可以通过在

        .bashrc
        

        文件中添加以下行来实现这一点:

        深色版本

        export DISPLAY=$(grep -oP '(?<=nameserver ).+' /etc/resolv.conf):0
        
      • 或者简单地在终端中执行 export DISPLAY=localhost:0(假设你的 X Server 正在本地监听)。

    3. 允许连接到 X Server

      • 根据所使用的 X Server,可能需要禁用访问控制或以其他方式允许来自 WSL 的连接。
    4. 启动 GUI 应用程序

      • 启动你的 X Server,然后在 WSL 中运行 GUI 应用程序。

图形化文件管理工具

  • #sudo apt install x11-apps
    #sudo apt install nautilus
    sudo apt install thunar
    thunar
    

3. 安装UUID-DEV、NASM、BISON、FLEX

  • 下载各项依赖

    • # 下载各项依赖
      sudo apt-get install uuid-dev nasm bison flex
      

4. 安装GCC、MAKE

  • sudo apt-get install build-essential
    gcc --version
    make --version
    

5.(排坑)安装 X11 库及其扩展,否则edk2编译会报错

  • # 安装X11库及其扩展,因为编译模拟器的过程中有源代码需要使用
    # #include <X11/**>
    sudo apt-get install libx11-dev x11proto-xext-dev libxext-dev
    
  • 将 NASM 更新到 2.15.x 以上版本,当前的edk2项目需要依赖nasm2.15以上版本,否则编译会报错

6. 下载EDK2项目以及必要的开发包

# 进入桌面,新建一个文件夹,我的是UEFI,进入这个文件夹
cd /home/dev/UEFI
# 从git上拉取EDK2项目文件
git clone http://github.com/tianocore/edk2.git
git clone http://github.com/tianocore/edk2-libc.git
git clone http://github.com/acpica/acpica.git
# 然后进入edk2文件夹执行update
cd edk2
git submodule update --init
# 这一步会等待较长时间,一定要update成功,否则会编译失败
# 因为git项目中很多应用的第三方插件库是以链接的形式存在的
# clone时不会把链接的文件下载,只能通过update下载包含的链接文件

3. 编译相关工具

1. 编译ACPICA生成ISAL编译器开发包

# 进入UEFI文件夹
cd /home/dev/UEFI/
make -C ./acpica/

2.编译BaseTools

# 进入edk2文件夹
cd edk2/
make -C edk2/BaseTools
  • 遇到错误

    • root@Crypto:/home/dev# cd edk2
      root@Crypto:/home/dev/edk2# make -C BaseTools
      make: Entering directory '/home/dev/edk2/BaseTools'
      make -C Source/C
      make[1]: Entering directory '/home/dev/edk2/BaseTools/Source/C'
      Attempting to detect HOST_ARCH from 'uname -m': x86_64
      Detected HOST_ARCH of X64 using uname.
      mkdir -p .
      make -C Common
      make[2]: Entering directory '/home/dev/edk2/BaseTools/Source/C/Common'
      ar crs ../libs/libCommon.a BasePeCoff.o BinderFuncs.o CommonLib.o Crc32.o Decompress.o EfiCompress.o EfiUtilityMsgs.o FirmwareVolumeBuffer.o FvLib.o MemoryFile.o MyAlloc.o OsPath.o ParseGuidedSectionTools.o ParseInf.o PeCoffLoaderEx.o SimpleFileParsing.o StringFuncs.o TianoCompress.o
      make[2]: Leaving directory '/home/dev/edk2/BaseTools/Source/C/Common'
      make -C BrotliCompress
      make[2]: Entering directory '/home/dev/edk2/BaseTools/Source/C/BrotliCompress'
      gcc  -c -I ./brotli/c/include -I .. -I ../Include/Common -I ../Include/ -I ../Include/IndustryStandard -I ../Common/ -I .. -I . -I ../../../../MdePkg/Include/X64/ -I ../../../../MdePkg/Include -MD -fshort-wchar -fno-strict-aliasing -fwrapv -fno-delete-null-pointer-checks -Wall -Werror -Wno-deprecated-declarations -Wno-stringop-truncation -Wno-restrict -Wno-unused-result -nostdlib -g -O2  BrotliCompress.c -o BrotliCompress.o
      BrotliCompress.c:20:10: fatal error: ./brotli/c/common/constants.h: No such file or directory
         20 | #include "./brotli/c/common/constants.h"
            |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      compilation terminated.
      make[2]: *** [../Makefiles/footer.makefile:21: BrotliCompress.o] Error 1
      make[2]: Leaving directory '/home/dev/edk2/BaseTools/Source/C/BrotliCompress'
      make[1]: *** [GNUmakefile:79: BrotliCompress] Error 2
      make[1]: Leaving directory '/home/dev/edk2/BaseTools/Source/C'
      make: *** [GNUmakefile:19: Source/C] Error 2
      make: Leaving directory '/home/dev/edk2/BaseTools'
      
    • 编译器找不到 brotli 库中的头文件,具体是:

      • ./brotli/c/common/constants.h
      • 而这个目录或文件 不存在于你的 EDK II 源码中
      • 这是因为在较新的 EDK II 分支中(如 developedk2-stable202311),brotli 子模块是以 Git Submodule 的方式引入的。如果你克隆项目时没有使用 --recursive 参数,或者没有手动更新子模块,就会缺少这些依赖。
  • 解决方法:同步 Git 子模块

  • # 回到 EDK II 根目录
    cd /home/dev/edk2
    
    # 初始化并更新子模块(特别是 brotli)
    git submodule init
    git submodule update
    

3. 新建 myexport.sh 文件

  • 进入桌面UEFI文件夹

    • cd /home/dev/UEFI
  • 新建myexport.sh,并打开

    • vim myexport.sh
    • 输入以下内容
  • 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
    export GCC5=/usr/bin/gcc
    

4. 编译Emulator模拟器

cd /home/dev/UEFI/
source myexport.sh
source edk2/edksetup.sh
build -p edk2/EmulatorPkg/EmulatorPkg.dsc -t GCC5 -a X64

5. 编译UEFI程序

cd /home/dev/UEFI/
build -p edk2-libc/AppPkg/AppPkg.dsc -t GCC5 -a X64

4. 运行模拟器执行UEFI程序

# 进入编译bild目录
cd /hone/dev/UEFI/Build/EmulatorX64/DEBUG_GCC5/X64/
# 执行Host文件
./Host
  • 在UEFI系统中输入 ***fs0:***进入虚拟器的工作目录:
  • 输入对应的.efi执行

5.开发流程

  1. UEFI模拟器的 fs0: 对应的文件目录为 桌面/UEFI/Build/EmulatorX64/DEBUG_GCC5/X64/

    • 其中,用户自定义的.efi文件为Hello.efi和Main.efi,其他为系统文件。
  2. 开发时,要进入 UEFI/edk2-libc/AppPkg/Applicayions 目录,修改Hello或Main文件夹中的 .c 文件,二者的区别在于依赖的库文件不同。Hello的依赖库相对较小,而Main的依赖库为C语言标准库,更多具体信息可以参考 UEFI/edk2-libc/AppPkg/ReadMe.txt

  3. 代码编写完毕后,重新编译。执行

    cd /home/dev/UEFI/
    source myexport.sh
    source edk2/edksetup.sh
    # 执行build前必须加上上边的两条source语句
    build -p edk2-libc/AppPkg/AppPkg.dsc -t GCC5 -a X64
    
  4. 将build生成的Hello.efi或者是Main.efi(根据自己的设置走)文件,移动到 模拟器工作目录

    • build结果文件路径:桌面/UEFI/Build/AppPkg/DEBUG_GCC5/X64/

    • 模拟器工作路径 :桌面/UEFI/Build/EmulatorX64/DEBUG_GCC5/X64/

  5. 移动文件可以热操作,即不需要关闭模拟器就可以移动.efi文件。移动后,再次输入文件名字即可运行。

6. 直接使用vscode打开wsl linux下的文件夹,就可以使用了

Tags :
Share :