Dalam arsitektur BIOS Legacy, setelah bootloader menyerahkan kendali ke kernel, hubungan antara firmware dan sistem operasi menjadi sangat kabur dan rapuh. UEFI memperbaiki hal ini dengan membagi layanannya menjadi dua kategori besar yang sangat terstruktur: Boot Services (BS) dan Runtime Services (RS).
Bagi pengembang RezaOS, memahami kapan harus menggunakan (dan kapan harus membuang) layanan ini adalah perbedaan antara sistem yang stabil dan sistem yang sering mengalami kernel panic. Artikel ini akan membedah siklus hidup layanan UEFI dari awal hingga akhir.
1. System Table: Buku Telepon Utama UEFI
Saat fungsi efi_main pada RezaOS dipanggil, ia menerima sebuah parameter krusial bernama SystemTable. Bayangkan struktur ini sebagai buku telepon raksasa yang berisi pointer (alamat) menuju seluruh layanan yang disediakan UEFI.
Di dalam SystemTable inilah terdapat dua pointer utama:
- BootServices (BS): Pointer ke layanan yang hanya aktif selama fase booting.
- RuntimeServices (RS): Pointer ke layanan yang tetap hidup selamanya.
2. Boot Services (BS): Tim Konstruksi Pembangunan OS
Boot Services adalah kumpulan fungsi yang dirancang untuk membantu bootloader menyiapkan lingkungan kernel. Karena fungsinya yang sangat luas, layanan ini memakan banyak ruang di memori RAM.
Layanan Utama di dalam Boot Services:
- Memory Services: Mengalokasikan dan membebaskan RAM (
AllocatePool,FreePool,GetMemoryMap). - Protocol Services: Mencari dan menginstal driver hardware (
LocateProtocol,HandleProtocol). - Event Services: Mengatur timer dan menunggu input keyboard (
WaitForEvent,CreateEvent). - Image Services: Memuat file
.EFIlain dari disk ke memori.
Sifat Boot Services:
Layanan ini bersifat sementara. Begitu kernel RezaOS sudah siap dan kita memanggil fungsi ExitBootServices(), seluruh layanan ini akan dihancurkan. Mengapa? Agar RAM yang digunakan oleh fungsi-fungsi ini bisa diambil alih (reclaimed) oleh kernel untuk keperluan lain.
3. Runtime Services (RS): Pelayan Setia di Balik Layar
Berbeda dengan BS, Runtime Services adalah layanan yang tetap tersedia bahkan setelah OS berjalan penuh (misalnya saat Anda sudah masuk ke desktop atau terminal). Layanan ini dirancang sangat minimalis agar tidak membebani performa OS.
Layanan Utama di dalam Runtime Services:
- Variable Services: Membaca dan menulis data ke NVRAM (Non-Volatile RAM). Ini digunakan untuk menyimpan urutan boot atau konfigurasi “Secure Boot”.
- Time Services: Membaca jam fisik komputer (Real-Time Clock / RTC) dan mengatur alarm.
- Reset Services: Melakukan reboot atau shutdown pada komputer.
- Virtual Memory Services: Membantu memetakan alamat memori UEFI agar tetap bisa diakses oleh OS dalam mode virtual.
4. Perbedaan Vital: BIOS vs UEFI
Pada era BIOS, kita sering mengalami masalah saat ingin memanggil layanan BIOS dari mode 32-bit atau 64-bit. Kita harus kembali ke Real Mode (16-bit), memanggil interupsi, lalu kembali lagi ke mode awal. Ini sangat lambat dan berbahaya.
UEFI Runtime Services mengatasi ini dengan menyediakan fungsi yang Native 64-bit. Kita bisa memanggil jam sistem langsung dari kernel C tanpa perlu berpindah mode CPU.
| Fitur | Boot Services (BS) | Runtime Services (RS) |
| Ketersediaan | Hanya saat Booting | Selamanya (Boot + OS) |
| Fungsi Utama | Inisialisasi Hardware & RAM | Jam, Power, NVRAM |
| Kapasitas Memori | Besar (Modular) | Kecil (Efisien) |
| Setelah ExitBootServices | Hancur / Tidak Valid | Tetap Aktif |
| Contoh Penggunaan | Load Kernel dari Disk | Shutdown Sistem |
5. Implementasi pada RezaOS: Titik Handover
Dalam alur kerja RezaOS, kita melakukan pembagian tugas yang jelas:
- Fase Booting: Kita menggunakan Boot Services semaksimal mungkin. Kita meminta memory map, kita mencari protokol grafis (GOP), dan kita memuat file kernel ke RAM.
- Fase Handover: Kita mengambil informasi penting dari Boot Services (seperti alamat Framebuffer video dan Memory Map), menyimpannya ke struktur data kita sendiri.
- Fase Exit: Kita memanggil
SystemTable->BootServices->ExitBootServices(). - Fase Runtime: Setelah kernel berjalan, jika RezaOS ingin mematikan komputer, kita memanggil
SystemTable->RuntimeServices->ResetSystem().
Kesimpulan
Pembagian layanan menjadi Boot dan Runtime adalah salah satu desain terpintar dalam spesifikasi UEFI. Ini memberikan fleksibilitas luar biasa bagi pengembang OS untuk mendapatkan bantuan maksimal saat “membangun rumah” (Booting), tanpa harus dibebani oleh “staf konstruksi” yang tidak perlu saat “rumah sudah ditempati” (OS Running). Hanya pelayan setia (Runtime Services) yang tetap tinggal untuk membantu tugas-tugas dasar hardware.
Next Step: Pada Bab 9, kita akan membahas momen paling krusial dan menegangkan bagi setiap pengembang OS: ExitBootServices. Kita akan melihat apa yang sebenarnya terjadi saat kita memutuskan koneksi dengan UEFI dan mengambil alih CPU sepenuhnya.
