INF trong EDK II là gì?
Quicknote giải thích file INF trong EDK II.
INF là metadata của một module EDK II. Nó trả lời câu hỏi: module này là loại gì, entry point ở đâu, dùng source file nào, cần package nào, cần library class nào, consume protocol/PCD nào.
Nếu C file là phần “logic”, thì INF là phần “module nói với build system rằng tôi cần gì”.
Một DXE driver tối giản
MyDxe/
├─ MyDxe.inf
└─ MyDxe.c [Defines]
INF_VERSION = 0x00010017
BASE_NAME = MyDxe
FILE_GUID = 22222222-3333-4444-5555-666666666666
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = MyDxeEntryPoint
[Sources]
MyDxe.c
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
MyPkg/MyPkg.dec
[LibraryClasses]
UefiDriverEntryPoint
UefiBootServicesTableLib
DebugLib
BaseMemoryLib
BoardConfigLib
[Protocols]
gEfiLoadedImageProtocolGuid
[Pcd]
gMyPkgTokenSpaceGuid.PcdEnableVerboseLog
Khi muốn gọi hàm của module/library khác
Đây là lỗi rất hay gặp khi mới đọc EDK II: thấy hàm trong source tree rồi include header, nhưng build/link vẫn lỗi.
Trong EDK II, muốn gọi code từ library khác, bạn cần đủ các mảnh sau:
Include đúng header
Header phải nằm trong package public include hoặc đường include hợp lệ.
Khai báo Package + LibraryClass
Module nói rõ package và library interface mình cần.
Map LibraryClass sang Instance
Platform chọn implementation cụ thể cho library class đó.
Symbol được resolve
Nếu thiếu mapping/library instance, rất dễ gặp unresolved external symbol.
Ví dụ trong C:
#include <Library/BoardConfigLib.h>
EFI_STATUS
EFIAPI
MyDxeEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
CONST BOARD_GPIO_TABLE *Table;
Table = BoardConfigGetGpioTable ();
DEBUG ((DEBUG_INFO, "GPIO table = %p\n", Table));
return EFI_SUCCESS;
}
Nếu chỉ include header nhưng INF thiếu:
[LibraryClasses]
BoardConfigLib
hoặc DSC thiếu:
[LibraryClasses]
BoardConfigLib|MyPkg/Library/BoardConfigLib/BoardConfigLib.inf
thì rất dễ gặp link error.
Build error vs link error
| Mục | Giá trị | Ghi chú |
|---|---|---|
| Header not found | Thiếu package/include | Kiểm tra [Packages] trong INF và [Includes] trong DEC. |
| PCD not found | Thiếu DEC hoặc thiếu [Pcd] | PCD phải được khai báo trong DEC và module reference trong INF. |
| Unresolved external symbol | Thiếu library class/instance | Kiểm tra [LibraryClasses] trong INF và mapping trong DSC. |
| Build pass nhưng không chạy | Không nằm trong FDF hoặc DEPEX chưa thỏa | Kiểm tra FV image và dispatcher log. |
INF không quyết định tất cả
INF nói module cần gì, nhưng chưa đủ để module xuất hiện trong firmware image. Module vẫn cần:
- được đưa vào DSC để build trong platform;
- được đưa vào FDF/FV nếu muốn nằm trong ROM image;
- dependency thỏa nếu là PEIM/DXE driver;
- đúng module type và entry point.
Checklist INF khi thêm module mới
Ghi nhớ nhanh
INF là “bản khai nhu cầu” của module. Khi build lỗi, hãy đọc INF như một checklist: module này nói đủ những thứ nó đang dùng trong C chưa?
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.