固件源码研究(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