Menyelami OSDev: Membangun Aplikasi UEFI Pertama di Fedora

Setelah pada pembahasan sebelumnya kita berhasil menaklukkan BIOS Real Mode dan menampilkan teks ke layar menggunakan interupsi 0x10, kini saatnya kita melangkah ke era modern: UEFI (Unified Extensible Firmware Interface).

Jika BIOS membatasi kita pada mode 16-bit dengan memori yang sangat sempit, UEFI membuka pintu menuju arsitektur 64-bit sejak detik pertama booting. Mari kita bedah prosedur pembuatannya di lingkungan Fedora.


1. Persiapan Environment (Fedora)

Berbeda dengan pengembangan BIOS yang cukup menggunakan NASM, pengembangan UEFI membutuhkan EDK2 (EFI Development Kit II) dari TianoCore. Karena kita menggunakan Fedora, kita akan menggunakan dnf untuk memasang dependensi yang diperlukan.

Install Dependensi

Buka terminal dan jalankan perintah berikut:

sudo dnf groupinstall "Development Tools" "C Development Tools and Libraries"
sudo dnf install libuuid-devel acpica-tools nasm python3 git qemu-system-x86 ovmf

Setup EDK2

Kita akan mengunduh framework EDK2. Ini bukan sekadar kompiler, melainkan SDK lengkap yang menyediakan pustaka standar untuk berkomunikasi dengan firmware.

git clone --recursive https://github.com/tianocore/edk2.git
cd edk2
source edksetup.sh
make -C BaseTools


2. Struktur Proyek: Hello World UEFI

Dalam UEFI, kita tidak lagi menulis kode di sektor nol (MBR). Kita menulis aplikasi .efi dalam bahasa C. Mari kita buat folder proyek baru di dalam direktori edk2 dengan nama RezaPkg.

File 1: HelloWorld.c

File ini berisi logika utama. Perhatikan bahwa kita tidak menggunakan main(), melainkan UefiMain.

#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>

EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  // Mencetak string ke layar (Ekuivalen dengan INT 10h di BIOS)
  Print(L"Hello UEFI World dari Fedora!\n");
  
  Print(L"Tekan tombol apa saja untuk keluar...\n");

  // Reset input buffer
  SystemTable->ConIn->Reset(SystemTable->ConIn, FALSE);

  // Menunggu keypress (Ekuivalen dengan INT 16h di BIOS)
  EFI_INPUT_KEY Key;
  UINTN Index;
  gBS->WaitForEvent(1, &SystemTable->ConIn->WaitForKey, &Index);
  SystemTable->ConIn->ReadKeyStroke(SystemTable->ConIn, &Key);

  return EFI_SUCCESS;
}

File 2: HelloWorld.inf

Ini adalah file deskripsi yang memberitahu EDK2 bagaimana cara mengompilasi kode kita.

Ini, TOML

[Defines]
  INF_VERSION                    = 0x00010005
  BASE_NAME                      = HelloWorld
  FILE_GUID                      = 12345678-1234-1234-1234-123456789012
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = UefiMain

[Sources]
  HelloWorld.c

[Packages]
  MdePkg/MdePkg.dec

[LibraryClasses]
  UefiApplicationEntryPoint
  UefiLib


3. Proses Build dan Uji Coba

Untuk mengompilasi kode di atas, kita harus mendaftarkan paket RezaPkg ke dalam file konfigurasi utama EDK2 (biasanya MdeModulePkg/MdeModulePkg.dsc di bagian [Components]), lalu jalankan:

Bash

# Build menggunakan GCC5 yang ada di Fedora
build -a X64 -t GCC5 -p MdeModulePkg/MdeModulePkg.dsc

Menjalankan di QEMU

Setelah berhasil, kita akan mendapatkan file HelloWorld.efi. Kita bisa mengujinya menggunakan emulator QEMU dengan mengarahkan BIOS-nya ke file OVMF (Open Virtual Machine Firmware):

Bash

qemu-system-x86_64 -bios /usr/share/OVMF/OVMF_CODE.fd -net none -drive file=fat:rw:Build/MdeModule/DEBUG_GCC5/X64/,format=raw


4. BIOS vs UEFI: Apa Bedanya?

Bagi teman-teman yang mengikuti seri OSDev ini dari awal, berikut adalah tabel komparasi teknis untuk memudahkan pemahaman:

FiturBIOS (Legacy)UEFI (Modern)
Bahasa UtamaAssembly (Low Level)C (High Level)
Mode Prosesor16-bit Real Mode64-bit Protected/Long Mode
Metode PemanggilanInterrupt (int 0x10, int 0x13)Protocol & Service Calls (gBS->...)
Limitasi Memori1 MB pertamaTidak terbatas (Akses RAM Penuh)
IdentifikasiBerdasarkan lokasi sektor (LBA)Berdasarkan GUID dan sistem file FAT32

Kesimpulan

Beralih ke UEFI bukan berarti kita meninggalkan dasar-dasar sistem operasi, melainkan kita berpindah ke standar industri yang lebih efisien dan kuat. Dengan EDK2 di Fedora, kita memiliki alat yang sangat tangguh untuk membangun bootloader yang mampu memuat kernel sistem operasi modern.