UEFI System Table là gì?
UEFI System Table là bảng trung tâm firmware truyền vào mọi UEFI image. Từ đây có thể đến Boot Services, Runtime Services, console và Configuration Table.
UEFI System Table (EFI_SYSTEM_TABLE) là bảng trung tâm mà firmware truyền vào mọi UEFI image khi bắt đầu chạy. Từ đây, driver hoặc application có thể đến Boot Services, Runtime Services, console và Configuration Table.
Cấu trúc EFI_SYSTEM_TABLE
typedef struct {
EFI_TABLE_HEADER Hdr; // Signature, Revision, CRC32
CHAR16 *FirmwareVendor; // Tên vendor firmware
UINT32 FirmwareRevision;
EFI_HANDLE ConsoleInHandle;
EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn; // Keyboard input
EFI_HANDLE ConsoleOutHandle;
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut; // Text output
EFI_HANDLE StandardErrorHandle;
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *StdErr;
EFI_RUNTIME_SERVICES *RuntimeServices; // → gRT
EFI_BOOT_SERVICES *BootServices; // → gBS
UINTN NumberOfTableEntries;
EFI_CONFIGURATION_TABLE *ConfigurationTable; // ACPI, SMBIOS, ...
} EFI_SYSTEM_TABLE;
Mọi UEFI driver và application đều nhận pointer đến struct này qua entry point.
Entry point và cách nhận SystemTable
EFI_STATUS EFIAPI
MyDriverEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
// SystemTable là pointer đến EFI_SYSTEM_TABLE firmware truyền vào
// ImageHandle là handle của image đang chạy
// Từ SystemTable có thể lấy gBS và gRT trực tiếp:
EFI_BOOT_SERVICES *BS = SystemTable->BootServices;
EFI_RUNTIME_SERVICES *RT = SystemTable->RuntimeServices;
return EFI_SUCCESS;
}
gST, gBS, gRT là gì?
Trong module UEFI/DXE thông thường của EDK II, AutoGen và các library như UefiBootServicesTableLib / UefiRuntimeServicesTableLib setup các global pointer này từ SystemTable trước khi entry point của module được gọi:
// Được khai báo bởi library - không cần tự định nghĩa
extern EFI_SYSTEM_TABLE *gST;
extern EFI_BOOT_SERVICES *gBS;
extern EFI_RUNTIME_SERVICES *gRT;
Người viết module thường không tự định nghĩa lại các biến này. Chỉ cần link đúng library và include header phù hợp.
Đây chỉ là shortcut để code gọn hơn - về bản chất vẫn là các pointer lấy từ SystemTable. Khi gBS->AllocatePool(), thực chất là SystemTable->BootServices->AllocatePool().
ConIn và ConOut
System Table cũng là nơi lấy console I/O:
// In text ra console
SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello UEFI\n");
// Hoặc qua gST
gST->ConOut->OutputString(gST->ConOut, L"Hello UEFI\n");
Khi một UEFI application không in được gì ra màn hình, kiểm tra ConOut có hợp lệ không và console output path đã được connect chưa trước khi debug sâu hơn.
Configuration Table
ConfigurationTable là mảng các entry theo dạng {GUID, pointer}. Đây là cơ chế để firmware publish pointer đến ACPI RSDP, SMBIOS entry point, DTB và các system table khác cho OS loader:
// Tìm ACPI 2.0 table trong Configuration Table
for (UINTN i = 0; i < SystemTable->NumberOfTableEntries; i++) {
if (CompareGuid(
&SystemTable->ConfigurationTable[i].VendorGuid,
&gEfiAcpi20TableGuid
)) {
VOID *Rsdp = SystemTable->ConfigurationTable[i].VendorTable;
// Tìm thấy ACPI 2.0 RSDP - từ đây đi tiếp đến XSDT/RSDT và các ACPI table khác
break;
}
}
| Mục | Giá trị | Ghi chú |
|---|---|---|
| gEfiAcpi20TableGuid | ACPI 2.0 RSDP | OS loader dùng để tìm Root System Description Pointer. |
| gEfiSmbiosTableGuid | SMBIOS table | Chứa thông tin hardware: CPU, memory, mainboard. |
| gEfiSmbios3TableGuid | SMBIOS 3.x table | 64-bit version, phổ biến hơn trên hệ thống hiện đại. |
| gEfiDtbTableGuid | Device Tree Blob | Thường dùng trên một số platform ARM/RISC-V; có platform dùng DTB, có platform dùng ACPI. |
Khi nào cần đụng trực tiếp đến SystemTable?
Hầu hết code DXE driver chỉ dùng gBS và gRT - không cần đụng đến SystemTable trực tiếp. Nhưng có một số trường hợp cần:
- Tìm ACPI/SMBIOS table qua
ConfigurationTable - Đọc
FirmwareVendor/FirmwareRevisionđể identify firmware - Kiểm tra
ConOutkhi debug console không hoạt động - UEFI application cần check
StdErrđể output error riêng biệt
Checklist System Table
Câu hỏi tự kiểm tra
gBSvàSystemTable->BootServiceskhác nhau không?- Library constructor nào setup
gBSvàgRTtrong EDK II? - Sau
ExitBootServices(),gBScó còn dùng được không?gRTthì sao? ConfigurationTabledùng để làm gì?- Nếu application không in được ra console, bạn sẽ kiểm tra
ConOutvà console path như thế nào? FirmwareVendorlấy từ đâu?
Bài liên quan
Nguồn tham khảo public
- UEFI Specification 2.11 - EFI System Table
- EDK II MdePkg - UefiBootServicesTableLib.h
- EDK II MdePkg - UefiLib.h
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.
Runtime Services là gì?
Runtime Services là nhóm API UEFI còn hợp lệ sau ExitBootServices. Bao gồm variable, time, reset và virtual address mapping - truy cập qua gRT.
Boot Services là gì?
Boot Services là nhóm API của UEFI chỉ hợp lệ trong boot time. Bao gồm memory, protocol, event, image và controller services - tất cả truy cập qua gBS.
UEFI Variable là gì?
UEFI Variable lưu cấu hình firmware theo dạng Name + VendorGuid + Attributes + Data. Hiểu variable giúp debug boot option mất, Secure Boot fail và NVRAM đầy.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.