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.

Cập nhật 5 phút đọc
BIOS Terms cover

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:

  1. Search trong package DEC - grep GUID value trong toàn bộ source tree
  2. Search GitHub EDK II - GUID thường được định nghĩa trong MdePkg, MdeModulePkg, hoặc platform package
  3. Dùng UEFI Shell - nếu shell build có command phù hợp như guid hoặc dh/protocols để tra GUID đã biết
  4. 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

  1. GUID gồm bao nhiêu byte và có dạng textual như thế nào?
  2. 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?
  3. Trong EDK II, GUID được khai báo ở file nào và dùng như thế nào trong INF?
  4. Event Group dùng GUID để làm gì?
  5. Nếu thấy raw GUID trong log firmware, bạn tìm tên của nó ở đâu?
  6. FFS file GUID dùng để làm gì trong firmware image?

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.