Menguasai Arsitektur UEFI: Bedah Tuntas SystemTable, Services, dan Protokol

Bagi seorang pengembang operating system (OS) atau antusias low-level programming, SystemTable bukan sekadar struktur data. Ia adalah “Kitab Suci” koordinasi antara perangkat keras dan perangkat lunak. Tanpa memahami tabel ini, mustahil bagi sebuah kernel untuk mengetahui berapa jumlah RAM yang tersedia, bagaimana menggambar piksel di layar, atau bahkan sekadar membaca berkas dari drive.

1. Anatomi SystemTable: Peta Jalan Menuju Hardware

SystemTable (dengan tipe data EFI_SYSTEM_TABLE) adalah sebuah struktur yang dialokasikan di memori oleh firmware saat komputer menyala. Ia bertindak sebagai direktori pusat.

Secara garis besar, isi dari SystemTable mencakup:

  • Hdr (Table Header): Berisi tanda tangan (signature) dan checksum untuk memastikan tabel tidak korup.
  • Console Handles: Pintu masuk untuk standar input (ConIn), standar output (ConOut), dan standar error (StdErr).
  • Runtime Services Table: Berisi fungsi-fungsi yang tetap hidup setelah OS berjalan.
  • Boot Services Table: Berisi fungsi-fungsi krusial yang hanya ada selama proses booting.
  • Configuration Table: Daftar tabel sistem lain seperti ACPI (Advanced Configuration and Power Interface) atau SMBIOS.

2. Boot Services: Tenaga Kerja di Balik Layar

Boot Services adalah kumpulan fungsi yang sangat kuat namun bersifat sementara. Mereka bertugas menyiapkan “panggung” sebelum kernel OS mengambil alih.

Fungsi Utama Boot Services:

  1. Memory Services: Melalui fungsi GetMemoryMap(), kita bisa mendapatkan peta RAM yang akurat—mana bagian yang digunakan firmware dan mana yang kosong untuk kernel.
  2. Protocol Services: Fungsi seperti LocateProtocol() digunakan untuk mencari “driver” tertentu di dalam firmware.
  3. Image Services: Digunakan untuk memuat dan menjalankan berkas .efi lain ke memori.

Contoh Penggunaan Boot Services (C):

Misalkan kita ingin mencari protokol grafis untuk mengatur resolusi layar.

EFI_GRAPHICS_OUTPUT_PROTOCOL *gop;
EFI_GUID gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;

// Menggunakan BootServices untuk mencari protokol grafis
status = SystemTable->BootServices->LocateProtocol(&gop_guid, NULL, (void**)&gop);

if (status == EFI_SUCCESS) {
    // Kita sekarang bisa mengatur resolusi layar!
}


3. Runtime Services: Jembatan yang Tak Pernah Putus

Berbeda dengan Boot Services yang “bunuh diri” setelah perintah ExitBootServices() dipanggil, Runtime Services tetap eksis di memori. OS modern seperti Linux atau Windows masih memanggil layanan ini untuk tugas-tugas spesifik.

Fungsi Utama Runtime Services:

  • Variable Services: Mengelola variabel NVRAM (Non-Volatile RAM). Contohnya, saat Anda mengubah urutan boot melalui perintah efibootmgr di Linux, OS sebenarnya sedang memanggil layanan SetVariable().
  • Time Services: Membaca jam fisik pada motherboard (RTC).
  • Virtual Memory Services: Membantu OS memetakan alamat fisik firmware ke alamat virtual yang dipahami kernel.

Contoh Penggunaan Runtime Services (C):

Mendapatkan waktu sistem saat ini dari hardware:

EFI_TIME Time;
SystemTable->RuntimeServices->GetTime(&Time, NULL);

// Sekarang kita bisa mencetak: Jam 10:30, Tanggal 20 Januari 2026


4. Sistem Protokol: Modul yang Dapat Diperluas

Konsep paling jenius dari UEFI adalah Protokol. UEFI tidak tahu setiap jenis kartu grafis atau kartu jaringan di dunia. Sebagai gantinya, produsen hardware menyertakan driver di dalam firmware yang “mendaftarkan” diri sebagai Protokol.

Beberapa protokol yang paling sering digunakan dalam pengembangan OS:

  1. Graphics Output Protocol (GOP): Menggantikan VGA teks lama. Dengan GOP, kita mendapatkan alamat memori Linear Framebuffer. Dengan menulis data warna ke alamat ini, kita bisa menggambar GUI, gambar, atau font custom.
  2. Simple File System Protocol: Memungkinkan kita membaca dan menulis berkas pada partisi FAT32 tanpa harus menulis driver sistem berkas dari nol.
  3. Network Stack Protocols: Memungkinkan booting melalui jaringan (PXE) secara native.

5. Kesimpulan: Mengapa Ini Penting bagi Kita?

Dalam pembuatan sistem operasi apa pun, SystemTable adalah pondasi.

  • Kita menggunakan Boot Services untuk mengalokasikan memori bagi kernel.
  • Kita menggunakan GOP untuk membuat tampilan visual pertama.
  • Kita menggunakan Configuration Table untuk menemukan tabel ACPI guna mengatur manajemen daya dan mendeteksi multi-core CPU.

Memahami SystemTable berarti memahami bagaimana menjembatani antara kode C yang kita tulis dengan keajaiban sirkuit elektronik di bawahnya.