EDK II Package là gì?
Quicknote giải thích package trong EDK II.
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.
Công bố public interface
Include path, GUID, Protocol, PPI, PCD token space.
Module khai báo mình cần gì
Packages, LibraryClasses, Protocols, Pcd.
Platform chọn implementation
Build module nào, map library nào, override PCD nào.
Đưa module vào firmware image
Module đã build có thật sự nằm trong FV/ROM hay không.
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_TYPEhiệ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.