Firmware Volume và FFS là gì?

Firmware Volume là container chứa FFS file trong firmware image. Hiểu FV/FFS giúp debug khi driver build pass nhưng không chạy vì thiếu trong FV.

Cập nhật 5 phút đọc
BIOS Terms cover

Firmware Volume (FV) là container chứa các firmware file trong flash image. FFS (Firmware File System) là format của từng file bên trong FV. Nếu coi firmware image như một filesystem đặc biệt, FV là một partition còn FFS file là từng file trong partition đó.

Cấu trúc tổng quan

Firmware image nhìn từ cao xuống thấp

Flash Device (ROM/SPI Flash)
├─ Firmware Volume 1  (ví dụ: FvMain)
│  ├─ EFI_FIRMWARE_VOLUME_HEADER
│  ├─ FFS File: DXE Core
│  │  ├─ PE32 Section  ← executable
│  │  └─ UI Section    ← tên hiển thị
│  ├─ FFS File: DXE Driver A
│  │  ├─ PE32 Section
│  │  └─ DEPEX Section ← dependency expression
│  └─ Free space / padding
├─ Firmware Volume 2  (ví dụ: FvBb - Pre-Memory)
│  ├─ FFS File: SEC module
│  └─ FFS File: PEIM
└─ Non-FV regions (NV storage, MRC data, ...)

Ba tầng: FV → FFS File → Section

Mục Giá trị Ghi chú
Firmware Volume (FV) Container lớn Có EFI_FIRMWARE_VOLUME_HEADER, block map, alignment và metadata nhận diện FV. Trong EDK II/FDF, FV thường được đặt tên như FvMain, FvBb.
FFS File Đơn vị file trong FV Mỗi FFS file có File GUID riêng, file type như DXE_DRIVER, PEIM, RAW, FV_IMAGE... và một hoặc nhiều section.
Section Nội dung bên trong FFS file PE32/TE (executable), DEPEX (dependency), UI (tên), RAW, Compressed, Firmware Volume (nested FV).

Section types phổ biến

Mục Giá trị Ghi chú
PE32 Executable image DXE driver, UEFI application. Dispatcher load section này để chạy.
TE Terse Executable PE32 stripped header, dùng cho PEIM tiết kiệm space.
DEPEX Dependency Expression Điều kiện để dispatcher dispatch module. Với DXE driver thông thường trong EDK II, thiếu DEPEX thường tương đương TRUE. Nếu có DEPEX nhưng dependency chưa thỏa, module bị giữ lại.
UI User Interface string Tên hiển thị của module. Có thể thấy trong build output, VolInfo/firmware dump hoặc debug log tùy tool.
RAW Binary data Config blob, microcode, logo, v.v. Không phải executable.
COMPRESSED Compressed section wrapper Chứa section khác dưới dạng nén. Dispatcher/loader phải decompress trước.

Quan hệ FDF và DSC trong EDK II

Trong EDK II, hai file quyết định module có nằm trong firmware image hay không:

DSC (Platform Description) - quyết định module được build:

[Components]
  MyPkg/Drivers/MyDriver/MyDriver.inf

FDF (Flash Description File) - quyết định module được đưa vào FV:

[FV.FvMain]
  INF MyPkg/Drivers/MyDriver/MyDriver.inf

Module trong DSC nhưng thiếu FDF: build pass, không chạy - đây là lỗi phổ biến nhất khi thêm driver mới.

Khi driver build pass nhưng không chạy

Đây là kịch bản hay gặp nhất liên quan FV/FFS:

  1. Thiếu trong FDF - module được build nhưng không được pack vào FV, dispatcher không thấy
  2. Sai FV hoặc FV không được phase đó discover - module có trong image nhưng FV không được dispatcher của phase tương ứng scan
  3. DEPEX chưa thỏa - module có trong FV nhưng dependency protocol chưa được install, bị giữ lại
  4. Thiếu FV HOB / FV không được expose - DXE Core không biết FV chứa driver tồn tại; PEI phải build FV HOB để DXE Core scan FV đó
  5. FV overflow / packing issue - build thường báo FV overflow hoặc module không pack như mong đợi; kiểm tra build log, .Fv.map và VolInfo

Debug FV/FFS

Sau khi build, ưu tiên kiểm tra bằng .Fv.map và VolInfo. UEFI Shell chỉ giúp kiểm tra runtime handle/protocol nếu firmware đã expose FV/FVB protocol:

# Map file của FV - liệt kê tất cả module đã pack
Build/Platform/DEBUG_GCC/FV/FvMain.Fv.map

# Dùng VolInfo (EDK II tool) để dump cấu trúc FV
VolInfo Build/Platform/DEBUG_GCC/FV/FvMain.Fv

# UEFI Shell: inspect handle/protocol nếu firmware expose FV protocol
Shell> dh -v
# Shell> memmap chỉ xem memory layout, không xác nhận module có trong FV

Checklist FV/FFS

Câu hỏi tự kiểm tra

  1. FV và FFS khác nhau thế nào?
  2. Module trong DSC nhưng thiếu FDF thì điều gì xảy ra?
  3. DEPEX section trong FFS file dùng để làm gì?
  4. Tại sao module có trong firmware image nhưng vẫn không được dispatcher phát hiện?
  5. FV HOB quan trọng thế nào với DXE Core?

Bài liên quan

Nguồn tham khảo public

Thấy nội dung này hữu ích?

Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.

Nội dung liên quan

Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.