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.

Cập nhật 4 phút đọc
Đọc bằng Tiếng Việt English 日本語
BIOS Terms cover

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 gBSgRT - 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 ConOut khi 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

  1. gBSSystemTable->BootServices khác nhau không?
  2. Library constructor nào setup gBSgRT trong EDK II?
  3. Sau ExitBootServices(), gBS có còn dùng được không? gRT thì sao?
  4. ConfigurationTable dùng để làm gì?
  5. Nếu application không in được ra console, bạn sẽ kiểm tra ConOut và console path như thế nào?
  6. FirmwareVendor lấy từ đâu?

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.