Seri Bedah Kode RezaOS — Bagian 1: Arsitektur Header dan Metadata Konstanta

Selamat datang dalam seri teknis pembedahan kode sumber RezaOS. Dalam artikel pembuka ini, kita akan menganalisis baris-baris awal dari sebuah bootloader UEFI (Unified Extensible Firmware Interface). Meskipun terlihat sederhana, baris-baris ini menentukan bagaimana program berkomunikasi dengan firmware dan bagaimana data karakter diproses dalam memori.


1. Header File: Jembatan Menuju Lingkungan Freestanding

Dua baris pertama pada kode sumber adalah pemanggilan pustaka yang mendefinisikan seluruh ekosistem pengembangan UEFI:

#include <efi.h>
#include <efilib.h>

Analisis Teknis:

Dalam pemrograman sistem operasi atau bare-metal, kita bekerja dalam lingkungan yang disebut Freestanding Environment. Artinya, kita tidak memiliki akses ke pustaka standar C (Standard Library) seperti <stdio.h> atau <stdlib.h> karena fungsi-fungsi tersebut membutuhkan sistem operasi yang sudah berjalan untuk mengelola input/output dan memori.

  • <efi.h>: Ini adalah file header inti yang mendefinisikan struktur data, protokol, dan tipe data primitif yang ditetapkan oleh spesifikasi UEFI. Di sinilah tipe data seperti EFI_HANDLE, EFI_SYSTEM_TABLE, dan berbagai GUID (Globally Unique Identifier) didefinisikan secara formal.
  • <efilib.h>: File ini merupakan bagian dari GNU-EFI toolchain. Header ini menyediakan abstraksi atau wrapper fungsional yang memudahkan pengembang. Tanpa header ini, setiap panggilan ke layanan UEFI harus dilakukan melalui penunjuk fungsi yang sangat teknis dan rawan kesalahan.

2. Definisi Makro dan Konvensi String Unicode

Baris berikutnya menetapkan identitas sistem melalui penginstruksian pre-processor:

#define NAMA_OS   L"RezaOS"
#define VERSI_OS  L"System Initializing..."

Analisis Teknis:

Penggunaan makro #define di sini bukan sekadar memberikan nama, melainkan menginstruksikan kompilator mengenai cara menangani literal string dalam memori.

  • Awalan L (Wide Character Literal): Karakteristik paling krusial di sini adalah penggunaan awalan L. Dalam standar C, string "Teks" disimpan sebagai array karakter 8-bit (ASCII/UTF-8). Namun, spesifikasi UEFI menetapkan bahwa seluruh komunikasi teks antara firmware dan aplikasi harus menggunakan UCS-2 atau UTF-16 (karakter lebar 16-bit).
  • Implikasi Memori: Dengan menggunakan L, kompilator akan mengalokasikan 2 byte untuk setiap karakter. Jika awalan ini dihilangkan, fungsi Print() pada UEFI akan salah menerjemahkan string, yang mengakibatkan munculnya karakter sampah atau kegagalan sistem karena ketidakcocokan ukuran buffer.

3. Penempatan Data pada Sektor Read-Only

Secara arsitektural, string yang didefinisikan melalui makro ini akan ditempatkan pada bagian .rodata (Read-Only Data) di dalam file biner .efi (yang berbasis format PE32+).

  1. Immutability: Data ini bersifat statis dan tidak dapat diubah selama runtime, memberikan stabilitas pada fase inisialisasi awal.
  2. Efisiensi Linker: Penggunaan makro memastikan bahwa nilai-nilai ini disisipkan secara langsung oleh pre-processor sebelum proses kompilasi dimulai, sehingga meminimalkan beban penggunaan variabel global pada memori stack yang terbatas pada fase awal booting.

Kesimpulan Bagian 1

Penyertaan header GNU-EFI dan pendefinisian string dalam format 16-bit merupakan langkah fundamental yang tidak boleh terlewatkan. Kesalahan dalam pemilihan tipe karakter atau ketiadaan header yang tepat akan menyebabkan kegagalan fatal pada tahap kompilasi maupun eksekusi, mengingat UEFI bekerja pada level yang sangat dekat dengan perangkat keras.


Langkah Selanjutnya:

Pada bagian kedua, kita akan membedah efi_main, gerbang masuk utama (Entry Point) eksekusi program, serta memahami peran vital dari parameter ImageHandle dan SystemTable.