GUID trong UEFI là gì?
GUID là định danh 128-bit dùng để tránh đụng tên giữa vendor và module trong UEFI. Gần như mọi interface, namespace và table đều dùng GUID.
GUID (Globally Unique Identifier) là định danh 128-bit dùng để tránh đụng tên giữa các module, vendor và specification. Trong UEFI, rất nhiều interface, namespace và object được nhận diện bằng GUID - protocol, PPI, variable namespace, HOB, event group, configuration table, và FFS file trong firmware volume.
Điểm quan trọng: GUID tự thân chỉ là một giá trị 128-bit, không tự nói lên “đây là protocol hay variable”. Ý nghĩa phụ thuộc vào API và context sử dụng: truyền vào LocateProtocol thì nó được hiểu là Protocol GUID; truyền vào GetVariable thì nó là VendorGuid; truyền vào CreateEventEx thì nó là Event Group GUID. Trong thiết kế thực tế, không nên tùy tiện reuse cùng một giá trị GUID cho nhiều mục đích khác nhau.
Cấu trúc một GUID
// Định nghĩa trong UefiBaseType.h
typedef struct {
UINT32 Data1;
UINT16 Data2;
UINT16 Data3;
UINT8 Data4[8];
} EFI_GUID;
// Ví dụ: EFI Global Variable GUID
// {8BE4DF61-93CA-11D2-AA0D-00E098032B8C}
EFI_GUID gEfiGlobalVariableGuid = {
0x8BE4DF61,
0x93CA,
0x11D2,
{ 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }
};
Dạng textual chuẩn là {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - 8-4-4-4-12 ký tự hex.
Cách khai báo và dùng trong EDK II
Trong EDK II, GUID thường được khai báo trong package DEC để module khác có thể tham chiếu. Header cung cấp extern declaration, còn module sử dụng cần khai báo dependency trong INF và include header phù hợp.
Trong file .dec của package:
[Protocols]
gEfiBlockIoProtocolGuid = { 0x964E5B21, 0x6459, 0x11D2, { 0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B } }
Trong file header .h:
extern EFI_GUID gEfiBlockIoProtocolGuid;
Trong INF của module cần dùng:
[Protocols]
gEfiBlockIoProtocolGuid ## CONSUMES
Sau khi module khai báo dependency trong INF và include đúng header, code có thể dùng symbol GUID trực tiếp, không tự init lại:
gBS->LocateProtocol(&gEfiBlockIoProtocolGuid, NULL, (VOID **)&BlockIo);
GUID dùng ở đâu trong UEFI?
| Mục | Giá trị | Ghi chú |
|---|---|---|
| Protocol GUID | Định danh interface DXE | Dùng với InstallProtocolInterface, LocateProtocol, OpenProtocol. |
| PPI GUID | Định danh interface PEI | Dùng trong PPI database của PEI Core. |
| VendorGuid (Variable) | Namespace của UEFI Variable | Name + VendorGuid mới xác định một variable. Sai GUID → EFI_NOT_FOUND dù tên đúng. |
| HOB GUID | Định danh GUID HOB | Producer và consumer phải dùng cùng GUID để tìm đúng HOB. |
| Event Group GUID | Định danh event group | Dùng với CreateEventEx. Ví dụ: gEfiEventExitBootServicesGuid. |
| Configuration Table GUID | Key trong System Table ConfigurationTable | Ví dụ: gEfiAcpi20TableGuid trỏ tới ACPI RSDP, gEfiSmbiosTableGuid trỏ tới SMBIOS. |
| FFS/FV file GUID | Định danh file trong firmware image | Mỗi FFS file trong FV có một GUID riêng. Firmware volume/dispatcher dùng GUID này như định danh file khi quản lý và nhận diện module; dispatch còn phụ thuộc type, section và DEPEX. |
Ví dụ thực tế: VendorGuid quan trọng thế nào
BootOrder dùng gEfiGlobalVariableGuid. Nếu code đọc đúng tên BootOrder nhưng sai VendorGuid, kết quả vẫn là EFI_NOT_FOUND:
// Đúng - global variable namespace
gRT->GetVariable(L"BootOrder", &gEfiGlobalVariableGuid, ...);
// Sai GUID → EFI_NOT_FOUND dù tên đúng
gRT->GetVariable(L"BootOrder", &gSomeOtherGuid, ...);
Đây là lỗi phổ biến khi debug variable: chỉ nhìn tên string mà quên kiểm tra VendorGuid.
Khi gặp một GUID lạ trong log hoặc code
GUID raw ({8BE4DF61-93CA-...}) trong log không nói lên gì nếu không có tên. Cách tìm:
- Search trong package DEC - grep GUID value trong toàn bộ source tree
- Search GitHub EDK II - GUID thường được định nghĩa trong
MdePkg,MdeModulePkg, hoặc platform package - Dùng UEFI Shell - nếu shell build có command phù hợp như
guidhoặcdh/protocolsđể tra GUID đã biết - GUID database online - một số cộng đồng duy trì database GUID UEFI phổ biến
Nếu GUID không tìm được trong public source, nó có thể là vendor-specific GUID của OEM/silicon vendor.
Checklist khi làm việc với GUID
Câu hỏi tự kiểm tra
- GUID gồm bao nhiêu byte và có dạng textual như thế nào?
- Tại sao cùng tên variable nhưng khác VendorGuid lại là hai variable hoàn toàn khác nhau?
- Trong EDK II, GUID được khai báo ở file nào và dùng như thế nào trong INF?
- Event Group dùng GUID để làm gì?
- Nếu thấy raw GUID trong log firmware, bạn tìm tên của nó ở đâu?
- FFS file GUID dùng để làm gì trong firmware image?
Bài liên quan
- Protocol là gì?
- PPI là gì?
- HOB là gì?
- UEFI Variable là gì?
- UEFI System Table là gì?
- TPL và Event là gì?
Nguồn tham khảo public
- UEFI Specification 2.11 - EFI GUID
- EDK II MdePkg - UefiBaseType.h
- EDK II MdePkg - Protocol/BlockIo.h (GUID example)
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.
Protocol trong UEFI là gì?
Protocol là interface install lên handle trong DXE, cho phép driver giao tiếp không phụ thuộc implementation. Hiểu Protocol giúp debug driver binding và locate fail.
DEC trong EDK II là gì?
Quicknote giải thích file DEC trong EDK II.
DXE Driver trong EDK II là gì?
Quicknote giải thích DXE Driver trong EDK II.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.