固件源码研究(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
熟悉环境和文档
-
阅读CodingMaster的源码及其编译系统的[官方文档](Coding Tools- 文集 哔哩哔哩专栏 (bilibili.com))。
-
确保你的开发环境满足编译
edk2的要求。可能需要的工具和依赖项可以在EDK II的文档中找到。比如,在Linux环境下,常见的依赖包括build-essential,uuid-dev,acpica-tools,git,subversion,nasm和其他相关工具。
编译 EDK II
一旦你的环境已经准备好,你就可以按照以下步骤编译 edk2:
-
获取源码:
从源码仓库(例如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
- 编译环境设置:
设置EDK2的编译环境变量,需要两条命令:
export EDK_TOOLS_PATH=$HOME/Android/edk2/BaseTools
. edksetup.sh BaseTools
ls Build/MdeModule/DEBUG__/_/HelloWorld.efi
- 构建:
根据你所研究的目标硬件平台、型号和规格,选择正确的.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