Library Class và Library Instance là gì?

Quicknote giải thích Library Class/Instance trong EDK II.

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

Trong EDK II, Library Class là interface logic mà module muốn dùng, còn Library Instance là implementation cụ thể được platform chọn trong DSC.

Điểm quan trọng: module thường không link trực tiếp tới một .lib cố định. Nó khai báo “tôi cần DebugLib”, còn platform quyết định dùng BaseDebugLibSerialPort, BaseDebugLibNull, hay implementation khác.

01 C code

Gọi hàm library

DEBUG(), CopyMem(), BoardConfigGetGpioTable().

02 INF

Khai báo LibraryClass

Module nói mình cần DebugLib, BaseMemoryLib, BoardConfigLib...

03 DSC

Map sang Library Instance

Platform chọn implementation cụ thể.

04 Link

Resolve symbol

Implementation được link vào module.

Library Class tách nhu cầu của module khỏi implementation của platform.

Ví dụ thực tế: gọi hàm của module/library khác

Trong C:

#include <Library/BoardConfigLib.h>

CONST BOARD_GPIO_TABLE *Table;
Table = BoardConfigGetGpioTable ();

Trong INF của module consume:

[Packages]
  MdePkg/MdePkg.dec
  MyPkg/MyPkg.dec

[LibraryClasses]
  UefiDriverEntryPoint
  DebugLib
  BoardConfigLib

Trong DSC:

[LibraryClasses]
  BoardConfigLib|MyPkg/Library/BoardConfigLib/BoardConfigLib.inf

Trong library instance INF:

[Defines]
  MODULE_TYPE = BASE
  LIBRARY_CLASS = BoardConfigLib|DXE_DRIVER UEFI_APPLICATION

Nếu LIBRARY_CLASS không support module type hiện tại, build có thể không chọn được instance phù hợp.

Các lỗi thường gặp

Mục Giá trị Ghi chú
Header not found Thiếu package/DEC Header public chưa được expose hoặc INF chưa thêm package.
Library class not found INF thiếu LibraryClass Module đang gọi hàm nhưng không khai báo library interface.
Instance not found DSC chưa map instance Platform chưa chọn implementation cụ thể.
Unresolved external symbol Mapping/library source sai Có khai báo nhưng implementation không cung cấp symbol cần link.
Wrong phase library Dùng nhầm PEI/DXE/SMM library Một số library chỉ hợp lệ trong phase/module type nhất định.

Vì sao cơ chế này hay?

Cùng một module có thể dùng DebugLib, nhưng platform DEBUG dùng serial log, platform RELEASE dùng null log. Source module không cần đổi.

# DEBUG build
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf

# RELEASE build
DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf

Đây là một kiểu “dependency injection” ở thời điểm build của EDK II.

Checklist LibraryClass

Ghi nhớ nhanh

Library Class = module cần năng lực gì. Library Instance = platform chọn implementation nào. Khi gặp link error trong EDK II, hãy kiểm tra chuỗi này trước khi nghi ngờ compiler.

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.