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.
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:
- Thiếu trong FDF - module được build nhưng không được pack vào FV, dispatcher không thấy
- 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
- DEPEX chưa thỏa - module có trong FV nhưng dependency protocol chưa được install, bị giữ lại
- 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 đó
- 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.mapvà 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
- FV và FFS khác nhau thế nào?
- Module trong DSC nhưng thiếu FDF thì điều gì xảy ra?
- DEPEX section trong FFS file dùng để làm gì?
- Tại sao module có trong firmware image nhưng vẫn không được dispatcher phát hiện?
- FV HOB quan trọng thế nào với DXE Core?
Bài liên quan
Nguồn tham khảo public
- UEFI PI Specification 1.9 - Firmware Storage
- EDK II - FDF File Specification
- EDK II BaseTools - VolInfo
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.