UEFI FDF文件格式
fdf(Flash Description File)用於生成固件映像,定義Image的內容和佈局信息,它由[Defines],[FD],[FV],[Rule]等幾個部分組成
[FD]:描述整個FD,FD的大小和加載地址,編譯完成後,在編譯目錄會生成MSM8998_EFI.fd文件,文件大小是2M;
[FD.Msm8998_EFI]
BaseAddress = 0x9FC00000|gEmbeddedTokenSpaceGuid.PcdEmbeddedFdBaseAddress #The base address of the FLASH Device.
Size = 0x00200000|gEmbeddedTokenSpaceGuid.PcdEmbeddedFdSize #The size in bytes of the FLASH Device
ErasePolarity = 1
BlockSize = 0x200
NumBlocks = 0x1000
FD又被分成多個邏輯區域,每個區域定義了位置,大小以及內容,格式如下:
# Offset|Size
# PcdOffsetCName|PcdSizeCName
# RegionType <FV, DATA, or FILE>
// 高通平臺FV定義如下:
0x00000000|0x00200000
gEmbeddedTokenSpaceGuid.PcdFlashFvMainBase|gEmbeddedTokenSpaceGuid.PcdFlashFvMainSize
FV = FVMAIN_COMPACT
FV就是我們要找的Firmware Volume,編譯完成後,會在編譯目錄的FV目錄生成多個".FV"文件;
FFS是FV中文件的組織形式,FV的工程文件描述FV由哪些ffs組成:
FVMAIN.inf
[files]
EFI_FILE_NAME = boot_images/Build/Msm8998LA_Core/DEBUG_CLANG38LINUX/FV/Ffs/FC510EE7-FFDC-
11D4-BD41-0080C73C8881FVMAIN/FC510EE7-FFDC-11D4-BD41-0080C73C8881FVMAIN.Ffs
EFI_FILE_NAME = boot_images/Build/Msm8998LA_Core/DEBUG_CLANG38LINUX/FV/Ffs/D6A2CB7F-6A18-
4e2f-B43B-9920A733700ADxeCore/D6A2CB7F-6A18-4e2f-B43B-9920A733700A.ffs
... ...
進入到Ffs目錄可以看到ffs文件的編譯命令,首先使用GenSec命令生成PE32格式的Image,然後使用GenFfs命令最終生成的ffs文件,".ui"文件是fdf中定義的編譯規則:
DxeCore的工程文件在MdeModulePkg/Core/Dxe/DxeMain.inf,其中定義了模塊名,模塊類型,模塊的GUID等信息;
Ffs/D6A2CB7F-6A18-4e2f-B43B-9920A733700ADxeCore/D6A2CB7F-6A18-4e2f-B43B-9920A733700ASEC1.1.pe32.txt
GenSec -s EFI_SECTION_PE32 -o boot_images/Build/Msm8998LA_Core/DEBUG_CLANG38LINUX/FV/Ffs/
D6A2CB7F-6A18-4e2f-B43B-9920A733700ADxeCore/D6A2CB7F-6A18-4e2f-B43B-9920A733700ASEC1.1.pe32 boot_images/Build/Msm8998LA_Core/DEBUG_CLANG38LINUX/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/DxeCore.efi
Ffs/D6A2CB7F-6A18-4e2f-B43B-9920A733700ADxeCore/D6A2CB7F-6A18-4e2f-B43B-9920A733700A.ffs.txt
GenFfs -t EFI_FV_FILETYPE_DXE_CORE -g D6A2CB7F-6A18-4e2f-B43B-9920A733700A -o boot_images/
Build/Msm8998LA_Core/DEBUG_CLANG38LINUX/FV/Ffs/D6A2CB7F-6A18-4e2f-B43B-9920A733700ADxeCore/D6A2CB7F-6A18-4e2f-B43B-9920A733700A.ffs -i boot_images/Build/Msm8998LA_Core/DEBUG_CLANG38LINUX/FV/Ffs/D6A2CB7F-6A18-4e2f-B43B-
9920A733700ADxeCore/D6A2CB7F-6A18-4e2f-B43B-9920A733700ASEC1.1.pe32 -i boot_images/Build/
Msm8998LA_Core/DEBUG_CLANG38LINUX/FV/Ffs/D6A2CB7F-6A18-4e2f-B43B-9920A733700ADxeCore/D6A2CB7F-6A18-4e2f-B43B-9920A733700ASEC2.ui
[FV]:定義固件卷的組織形式:
[FV.FvMain]
BlockSize = 0x40
NumBlocks = 0 # This FV gets compressed so make it just big enough
FvAlignment = 8 # FV alignment and FV attributes setting.
... ...
!include Apriori.fdf.inc
INF MdeModulePkg/Core/Dxe/DxeMain.inf
#
# PI DXE Drivers producing Architectural Protocols (EFI Services)
#
INF ArmPkg/Drivers/CpuDxe/CpuDxe.inf
... ...
#
# Applications
#
#QCOM Charger app
INF QcomPkg/Application/QcomChargerApp/QcomChargerApp.inf
FILE FREEFORM = a91d838e-a5fa-4138-825d-455e2303079e {
SECTION UI = "BDS_Menu.cfg"
SECTION RAW = QcomPkg/Library/PlatformBdsLib/LA/bds_menu.cfg
}
... ...
[FV.FVMAIN_COMPACT]
FvAlignment = 8
ERASE_POLARITY = 1
... ...
INF QcomPkg/XBLCore/XBLCore.inf
FILE FREEFORM = DDE58710-41CD-4306-DBFB-3FA90BB1D2DD {
SECTION UI = "uefiplat.cfg"
SECTION RAW = QcomPkg/Msm8998Pkg/LA/uefiplat.cfg
}
FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
SECTION GUIDED 1D301FE9-BE79-4353-91C2-D23BC959AE0C PROCESSING_REQUIRED = TRUE {
SECTION FV_IMAGE = FVMAIN
}
}
FvMain包括PI,DXE,APP等組件和CFG文件,FVMAIN_COMPACT包括XBLCore,uefiplat.cfg和FvMain;
[Rule]:定義根據給定INF生成FFS文件的規則,UI指示Unicode String:
[Rule.Common.DXE_DRIVER]
FILE DRIVER = $(NAMED_GUID) {
DXE_DEPEX DXE_DEPEX Optional |.depex
PE32 PE32 |.efi
UI STRING="$(MODULE_NAME)" Optional
}
[Rule.Common.UEFI_APPLICATION]
FILE APPLICATION = $(NAMED_GUID) {
UI STRING ="$(MODULE_NAME)" Optional
PE32 PE32 |.efi
}
常用縮寫:
FD:固件設備,指任何可以存儲固件的設備或設備集合:
FV:固件卷,指在FD上一個連續的部分,可以看成是一個邏輯設備,經常提到的FFS概念也是以FV的形式存在,它描述了FV中的文件組織形式;
FF:固件文件,指在FV上組織代碼和數據的一個集合;
FFS:FV上的文件實際上是以FFS的形式保存在FV上;
FDF:描述整個FD,以及各個FV,我們想了解FD中都有哪些FV,只要查看FDF文件即可;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.