发布于 

固件源码研究(UEFI固件&EDK II)

UEFI 固件和设备引导流程中,EDK II(EFI Development Kit II)是一个开源的UEFI固件开发环境,通常用于开发UEFI应用、驱动和固件EDK II提供了一个标准的固件开发框架,支持多种处理器架构,包括x86、x64、ARM等。

DisplayImageFv.inc 这个文件路径看起来是一个特定于硬件,可能是基于高通平台的 SoC(System on Chip),并涉及到 Samsung 设备的固件卷文件,其中 inc 扩展名表明这可能是一个包含文件(类似于头文件)。在 UEFI 或基础固件(BIOS)开发中,这样的文件可能被包含进其他文件,以提供配置参数、定义、映像数据等。总结来说:

EDK II 下面的文件和 DisplayImageFv.inc 结合起来意味着,使用 EDK II 框架来构建和加载特定的显示图像资源,这些资源用于装置的初始化和启动过程中。要了解这些文件如何具体结合,你可能需要查看相应平台的固件开发文档开机引导过程的具体详情。

具体来说,DisplayImageFv.inc 可能包含了与显示相关的资源或者配置参数,这些资源在系统启动(特别是在操作系统加载之前)时被引用以呈现图像,如主板的商标或者提示信息。EDK II 则负责处理这些信息,并确保在固件启动流程中的正确位置被加载和显示。

当将 EDK II 和 DisplayImageFv.inc 这样的文件结合时,你可能在构建一个首次启动时加载的显示图像(如启动LOGO初始化屏幕)。在 EDK II 环境下,固件卷文件FV, Firmware Volume)通常包含若干固件文件(FFS, Firmware File System),这些文件可以包含应用程序驱动程序或者其他数据

bootable 文件夹下的 bootloader 中的 edk2 通常需要编译,因为它是用于初始化和加载操作系统的UEFI环境(统一可扩展固件接口)的软件。edk2 是开发UEFI固件的一个开源实现,通常涉及到较为底层的硬件初始化过程。

EDK2全称是EFI Development Kit II,是第二代UEFI的官方开发库。如果把全称打出来,就是Extended Firmware Interface Development Kit II

熟悉环境和文档

  1. 阅读CodingMaster的源码及其编译系统的[官方文档](Coding Tools- 文集 哔哩哔哩专栏 (bilibili.com))。

  2. 确保你的开发环境满足编译 edk2 的要求。可能需要的工具和依赖项可以在EDK II的文档中找到。比如,在Linux环境下,常见的依赖包括build-essentialuuid-devacpica-toolsgitsubversionnasm 和其他相关工具。

编译 EDK II

一旦你的环境已经准备好,你就可以按照以下步骤编译 edk2

  1. 获取源码

    从源码仓库(例如GitHub)克隆或下载EDK II的源码。

        
    
    git clone https://github.com/tianocore/edk2.git
    

2.  安装第三方依赖库 比较建议一个一个的装,发现问题立即进行处理


sudo apt-get install build-essential

sudo apt-get install uuid-dev

sudo apt-get install iasl

sudo apt-get install nasm

最后 ->


git submodule update --init

``````

开始`编译`

```shell

make -C BaseTools
  1. 编译环境设置

设置EDK2的编译环境变量,需要两条命令:


export EDK_TOOLS_PATH=$HOME/Android/edk2/BaseTools

. edksetup.sh BaseTools

ls Build/MdeModule/DEBUG__/_/HelloWorld.efi
  1. 构建

根据你所研究的目标硬件平台、型号和规格,选择正确的.dsc文件(包含项目、库和模块的列表),然后运行构建命令。

参考

cp ~/Android/edk2/Build/MdeModule/DEBUG_GCC5/X64/HelloWorld.efi run-ovmf/hda-contents/
qemu-system-x86_64 -pflash bios.bin -hda fat:rw:hda-contents/ -net none

分析和研究

EDK II 源码以及文件目录

  • build 文件是编译文件

  • Conf 是配置文件

  • source 是源代码

  • inf 是驱动默认配置文件

编译遇到问题

Q:EDK II 编译出现问题  找不到 -luuid collect2: error: ld returned 1 exit status make[2]: ***

A: 问题出现在链接阶段,特别是链接器(ld)找不到 uuid 库。在Linux系统上,libuuid 是一个管理UUID(通用唯一识别码)的库,通常在编译代码时是必需的。

要解决这个问题,您需要确保 libuuid 开发包已经安装在您的系统中。安装方法取决于您使用的Linux发行版。以下是在一些常见Linux发行版上安装 libuuid 的方式:

对于基于Debian的系统(如Ubuntu):

Copy


sudo apt-get update

sudo apt-get install uuid-d

Q:ubuntu:~/Android/edk2$ . edksetup.shbash: /home/xxx/src/edk2/BaseTools/BuildEnv: 没有那个文件或目录

A:环境变量配置错误导致,使用find找到目录地址重新配置

find ~/Android/edk2 -name BuildEnv

export EDK_TOOLS_PATH=/home/xxx/Android/edk2/BaseTools

Q: 编译一直通过不了

A:nasm 版本太低,需要换一个版本

`git clone https://github.com/netwideassembler/nasm.git`

`2cd nasm`

`3./autogen.sh # 如果存在`

`4./configure`

`5make

`6sudo make install`

Q:qemu 版本6.0 太低,下载最新版本

A:wget https://download.qemu.org/qemu-9.0.1.tar.xz

tar xvJf qemu-9.0.1.tar.xz

cd qemu-9.0.1

./configure

make