INF trong EDK II là gì?

Quicknote giải thích file INF trong EDK II.

3 phút đọc
Đọc bằng Tiếng Việt English 日本語
EDK II Terms cover

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:

01 Header

Include đúng header

Header phải nằm trong package public include hoặc đường include hợp lệ.

02 INF

Khai báo Package + LibraryClass

Module nói rõ package và library interface mình cần.

03 DSC

Map LibraryClass sang Instance

Platform chọn implementation cụ thể cho library class đó.

04 Link

Symbol được resolve

Nếu thiếu mapping/library instance, rất dễ gặp unresolved external symbol.

Chuỗi khai báo để module dùng được library khác.

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.

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.