Dalam perjalanan mengembangkan sebuah sistem operasi, ada satu momen yang dianggap sebagai “titik sakral” sekaligus yang paling mendebarkan: momen penyerahan kekuasaan dari firmware ke kernel. Pada BIOS Legacy, momen ini terjadi saat kita melakukan Far Jump dari kode bootloader ke alamat memori kernel. Namun, di UEFI, proses ini diatur secara formal melalui sebuah fungsi kritis bernama ExitBootServices.
Artikel ini akan membedah apa yang sebenarnya terjadi saat RezaOS memutuskan untuk mengakhiri bantuan dari UEFI dan mengambil alih kendali penuh atas CPU dan perangkat keras.
1. Filosofi “Handover” dalam UEFI
Berbeda dengan BIOS yang membiarkan interupsi hardware tetap aktif atau dalam keadaan tidak menentu saat kernel dimulai, UEFI menuntut sebuah kontrak yang jelas. Fungsi ExitBootServices adalah cara sistem operasi mengatakan: “Terima kasih UEFI, tugasmu selesai. Sekarang saya yang memegang kendali penuh.”
Setelah fungsi ini sukses dipanggil, seluruh layanan Boot Services yang kita bahas di Bab 8 (seperti akses file, alokasi memori otomatis, dan input keyboard) akan dimatikan secara permanen.
2. Persyaratan Sebelum “Bercerai” dengan UEFI
Kita tidak bisa memanggil ExitBootServices begitu saja. Ada beberapa persiapan krusial yang harus dilakukan oleh bootloader RezaOS agar kernel tidak langsung crash setelah firmware pergi:
- Mendapatkan Peta Memori Terbaru: Ini adalah syarat mutlak. Kita harus memanggil
GetMemoryMapsesaat sebelum keluar. Mengapa? Karena proses pemanggilanExitBootServicesmembutuhkan sebuah kunci bernama MapKey. Jika ada alokasi memori yang berubah antara waktu kita mengambil peta memori dan waktu kita memanggil fungsi keluar, firmware akan menolak permintaan kita. - Menyiapkan Informasi Kernel: Kita harus sudah tahu di mana alamat kernel berada di RAM, di mana alamat framebuffer untuk grafik berada, dan informasi sistem lainnya (seperti pointer tabel ACPI). Informasi ini harus disimpan dalam struktur data yang bisa diakses oleh kernel nanti.
3. Memahami Parameter ExitBootServices
Secara teknis, fungsi ini terlihat sederhana namun memiliki konsekuensi besar:
Status = SystemTable->BootServices->ExitBootServices(ImageHandle, MapKey);
- ImageHandle: ID unik dari aplikasi bootloader kita.
- MapKey: Nilai unik yang didapat dari panggilan
GetMemoryMapterakhir. Ini adalah mekanisme keamanan UEFI untuk memastikan bahwa OS benar-benar memiliki gambaran memori terbaru sebelum mengambil alih.
Jika fungsi ini mengembalikan status EFI_SUCCESS, maka sistem secara resmi berada dalam kondisi Runtime.
4. Apa yang Terjadi di Balik Layar Firmware?
Saat RezaOS memanggil fungsi ini, firmware UEFI melakukan pembersihan besar-besaran:
- Menghentikan Timer Firmware: Semua interupsi timer yang digunakan UEFI untuk manajemen internal dihentikan.
- Menonaktifkan Driver Boot: Driver-driver firmware untuk disk, jaringan, dan input dimatikan.
- Menghapus Boot Services: Seluruh tabel fungsi Boot Services di RAM ditandai sebagai memori yang boleh digunakan kembali oleh OS.
5. Tabel Perbandingan: Handover BIOS vs UEFI
| Fitur | BIOS Legacy Handover | UEFI ExitBootServices |
| Metode | Jump ke alamat memori (jmp) | Panggilan API Terstandar |
| Status Hardware | Seringkali tidak menentu | Terdefinisi dengan jelas & bersih |
| Keamanan | Tidak ada verifikasi | Membutuhkan MapKey yang valid |
| Interupsi | Harus dimatikan manual (cli) | Dimatikan otomatis oleh firmware |
| Layanan Sisa | Interrupt BIOS (masih bisa dipanggil) | Hanya Runtime Services yang tersisa |
6. Kehidupan Setelah Exit: Selamat Datang di Dunia Kernel
Setelah ExitBootServices sukses, pengembang RezaOS harus menyadari beberapa hal penting:
- No More Print: Fungsi
Print()milik UEFI tidak lagi berfungsi. Jika Anda mencoba memanggilnya, sistem akan langsung restart karena pointer fungsinya sudah tidak valid. - Layar Tetap Aktif: Untungnya, memori grafis (Linear Framebuffer) yang kita dapatkan dari GOP tetap ada. Kernel harus mulai menggunakan driver tulis teks sendiri untuk menampilkan informasi ke layar.
- Interrupt Sendiri: Kernel harus segera menyiapkan IDT (Interrupt Descriptor Table) dan GDT (Global Descriptor Table) versinya sendiri untuk menangani keyboard, mouse, dan timer hardware.
Kesimpulan
ExitBootServices adalah gerbang menuju kemandirian bagi RezaOS. Ini adalah garis demarkasi yang memisahkan antara “Aplikasi UEFI” (yang masih bergantung pada bantuan firmware) dan “Sistem Operasi Sejati” (yang berdiri di atas kakinya sendiri). Memahami prosedur ini dengan benar memastikan transisi kekuasaan yang mulus tanpa meninggalkan “sampah” hardware yang bisa mengganggu stabilitas kernel di masa depan.
Next Step: Pada Bab 10 (Final), kita akan merangkum seluruh seri ini dengan membahas Membangun Kernel 64-bit. Kita akan melihat bagaimana semua bab yang telah kita pelajari bersatu untuk membentuk sebuah ekosistem OS modern.
