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文件即可;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章