Setelah menetapkan header dan metadata pada bagian pertama, kode sumber RezaOS berlanjut ke definisi fungsi utama yang menjadi gerbang eksekusi bagi firmware. Bagian ini sangat krusial karena mendefinisikan bagaimana kendali berpindah dari firmware UEFI ke program bootloader yang kita buat.
1. Definisi efi_main dan Konvensi EFIAPI
Struktur fungsi utama dalam aplikasi UEFI berbeda dengan program C konvensional:
EFI_STATUS
EFIAPI
efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
Analisis Teknis:
EFI_STATUS: Ini adalah tipe data pengembalian (return type) standar UEFI yang bertipe integer (biasanya 64-bit pada sistem x64). Nilai0(didefinisikan sebagaiEFI_SUCCESS) menandakan keberhasilan, sementara nilai lainnya merepresentasikan kode kesalahan spesifik.EFIAPI: Ini bukan sekadar label, melainkan sebuah makro yang menentukan Calling Convention (konvensi pemanggilan). Pada arsitektur x86_64, UEFI menggunakan Microsoft x64 Calling Convention. PenggunaanEFIAPImemastikan kompilator (seperti GCC) menyusun register CPU (seperti RCX, RDX, R8, R9) dengan urutan yang tepat agar sesuai dengan ekspektasi firmware saat memanggil fungsi ini.efi_main: Nama ini adalah entry point standar. Di dalam file Makefile atau Linker Script, kita harus secara eksplisit memberi tahu linker bahwa eksekusi dimulai dari simbol ini, bukan dari fungsimainbiasa.
2. Parameter Utama: ImageHandle dan SystemTable
Dua parameter yang diterima oleh efi_main adalah “kunci” untuk mengakses seluruh sumber daya komputer:
EFI_HANDLE ImageHandle: Ini adalah identitas unik (token) dari aplikasi bootloader RezaOS itu sendiri di dalam memori. Handle ini diperlukan saat kita ingin memanggil fungsi-fungsi yang berkaitan dengan pemuatan file atau saat kita ingin mengakhiri layanan boot.EFI_SYSTEM_TABLE *SystemTable: Ini adalah pointer ke struktur data yang paling penting dalam seluruh ekosistem UEFI. System Table berisi pointer ke tabel layanan lainnya, seperti Boot Services (layanan saat booting) dan Runtime Services (layanan yang tetap ada setelah OS berjalan).
3. Deklarasi Variabel Lokal dan GUID
Sebelum melakukan aksi, program menyiapkan beberapa variabel untuk menampung status dan referensi protokol:
EFI_STATUS Status;
EFI_GUID GopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
Analisis Teknis:
EFI_GUID: UEFI bekerja berbasis protokol yang diidentifikasi melalui GUID (Globally Unique Identifier). Di sini, kita menyiapkan GUID untuk GOP (Graphics Output Protocol). Tanpa GUID ini, kita tidak akan bisa menemukan “pintu” untuk mengakses kartu grafis.Gop: Ini adalah pointer kosong yang nantinya akan diisi dengan alamat memori dari interface grafik.
4. Initializing GNU-EFI dan Watchdog Timer
Langkah pertama dalam eksekusi adalah menstabilkan lingkungan kerja:
InitializeLib(ImageHandle, SystemTable);
uefi_call_wrapper(SystemTable->BootServices->SetWatchdogTimer, 4, 0, 0, 0, NULL);
Analisis Teknis:
InitializeLib: Fungsi ini disediakan oleh pustaka GNU-EFI. Perannya adalah menginisialisasi pustaka internal agar fungsi-fungsi bantuan sepertiPrint()atauuefi_call_wrapperdapat berfungsi dengan benar. Fungsi ini menghubungkanSystemTableke variabel global di dalam pustaka.- Watchdog Timer: Secara standar, UEFI memiliki “penjaga” berupa timer 5 menit. Jika dalam 5 menit OS tidak memberikan sinyal bahwa ia sudah berjalan, firmware akan berasumsi terjadi kegagalan dan melakukan restart otomatis.
uefi_call_wrapper: Karena perbedaan calling convention antara firmware (MS x64) dan beberapa kompilator lama, GNU-EFI menyediakan wrapper ini untuk memastikan argumen dilewatkan ke register yang benar dengan aman. Dengan memberikan nilai0pada parameter timer, kita secara efektif mematikan Watchdog Timer, memberikan waktu tak terbatas bagi RezaOS untuk melakukan inisialisasi.
Kesimpulan Bagian 2
Bab ini memperlihatkan betapa formalnya interaksi antara software dan firmware. Pengembang tidak bisa langsung menulis data ke memori; mereka harus mengikuti protokol pemanggilan fungsi yang ketat, memahami peran System Table, dan memastikan sistem tidak melakukan reboot prematur melalui pengaturan Watchdog Timer.
Langkah Selanjutnya:
Pada bagian ketiga, kita akan membedah proses Setup Grafik (GOP), di mana kita mulai meminta izin kepada firmware untuk mengambil alih kendali layar secara penuh.
