EDK II Package là gì?

Quicknote giải thích package trong EDK II.

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

Trong EDK II, Package không chỉ là một thư mục để chứa code. Nó là một ranh giới kỹ thuật: phần nào được công bố cho module khác dùng, phần nào chỉ là nội bộ, package này expose GUID/Protocol/PCD nào, và các module bên trong được build như thế nào.

Nếu nhìn như firmware engineer, package giống một “mini SDK” trong source BIOS. Một package tốt giúp module khác include header, dùng library class, gọi protocol hoặc đọc PCD mà không cần biết quá nhiều chi tiết bên trong.

Một package EDK II tối giản

MyPkg/
├─ MyPkg.dec              # public contract của package
├─ MyPkg.dsc              # build mô phỏng hoặc package-level build
├─ Include/
│  ├─ Library/MyLib.h     # public header
│  └─ Protocol/MyProto.h  # protocol definition
├─ Library/
│  └─ MyLib/MyLib.inf     # library instance
└─ Drivers/
   └─ MyDxe/MyDxe.inf     # module/driver dùng package này

Package giải quyết vấn đề gì?

Khi project BIOS lớn lên, nếu module nào cũng include chéo source của nhau thì build rất nhanh rơi vào tình trạng khó kiểm soát: header nằm lung tung, GUID bị định nghĩa trùng, library bị link sai phase, PCD không biết thuộc token space nào.

Package giúp chia source thành các vùng có hợp đồng rõ ràng.

01 DEC

Công bố public interface

Include path, GUID, Protocol, PPI, PCD token space.

02 INF

Module khai báo mình cần gì

Packages, LibraryClasses, Protocols, Pcd.

03 DSC

Platform chọn implementation

Build module nào, map library nào, override PCD nào.

04 FDF

Đưa module vào firmware image

Module đã build có thật sự nằm trong FV/ROM hay không.

Package không chỉ chứa code, nó công bố interface để module khác dùng an toàn.

Khi muốn dùng code từ package khác

Giả sử MyDxe muốn gọi hàm từ BoardConfigLib. Không phải cứ include header là đủ. Cần đi qua đủ ba lớp:

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

[LibraryClasses]
  UefiDriverEntryPoint
  DebugLib
  BoardConfigLib

Trong DSC của platform:

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

Nếu thiếu MyPkg.dec, thường gặp lỗi include/header hoặc GUID/PCD không tìm thấy. Nếu thiếu BoardConfigLib trong INF hoặc thiếu mapping trong DSC, build có thể tới bước link rồi fail bằng unresolved external symbol.

Mục Giá trị Ghi chú
DEC Package công bố gì? GUID, Protocol, PPI, PCD, include path public.
INF Module cần gì? Khai báo package, library class, protocol, pcd mà module dùng.
DSC Platform chọn gì? Chọn module build, map library instance, override PCD.
FDF Image chứa gì? Quyết định module/library output có được đóng vào firmware volume không.

Lỗi thực tế rất hay gặp

Một module build được ở package sample nhưng không build được trong platform thật. Lý do thường là package sample DSC đã map library/PCD sẵn, còn platform DSC thật thì chưa.

Ví dụ:

error LNK2001: unresolved external symbol BoardGetGpioTable

Đừng vội sửa C file. Hãy kiểm tra:

  • Hàm đó đến từ library nào?
  • Library class đã khai báo trong INF chưa?
  • DSC platform đã map library class sang instance chưa?
  • Library instance đó có support MODULE_TYPE hiện tại không?

Checklist khi thêm package/module mới

Ghi nhớ nhanh

Package trong EDK II là ranh giới maintain source. Khi build lỗi, đừng chỉ nhìn file C. Hãy nhìn theo chuỗi DEC → INF → DSC → FDF.

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.