Penulis: Reza Ervani bin Asmanu
1. Pendahuluan
Bagi seorang pengembang sistem operasi, inisialisasi subsistem grafis adalah gerbang utama interaksi pengguna. Namun, di balik tampilan visual di layar monitor, terjadi manipulasi memori dan register yang sangat berbeda antara era BIOS dan UEFI.
Perbedaan ini bukan sekadar perubahan API, melainkan perubahan topologi memori video (Video Memory Topology). Pada BIOS, kita bekerja dengan memori terfragmentasi (segmented/banked), sedangkan pada UEFI kita bekerja dengan memori linear kontinu (Linear Framebuffer). Bagian ini membedah mekanisme level rendah dari kedua arsitektur tersebut.
2. BIOS: Era VGA dan VESA (Kendala Segmentasi)
Dalam mode BIOS (Real Mode), CPU dibatasi oleh ruang alamat 1 MB (0x00000 – 0xFFFFF). Hal ini menciptakan hambatan fisika yang serius untuk grafis resolusi tinggi. Sebuah layar modern dengan resolusi standar 1024×768 dan kedalaman warna 32-bit membutuhkan memori sekitar 3 MB. Memori sebesar ini mustahil dipetakan secara utuh ke dalam ruang alamat Real Mode yang sempit.
Untuk mengakali batasan ini, arsitektur BIOS menggunakan dua pendekatan evolusioner:
2.1. Standard VGA Mode 13h (The 64KB Window)
Ini adalah mode grafik paling primitif namun paling mudah diakses. BIOS menyediakan “jendela” memori selebar 64 KB yang dipetakan secara keras (hardwired) di alamat fisik 0xA0000.
- Limitasi: Karena hanya 64 KB, resolusi maksimal hanya 320×200 pixel (Total 64.000 byte).
- Mekanisme Warna: Menggunakan Palette Indexed Color (8-bit). Data yang kita tulis ke memori (0-255) bukanlah warna merah/hijau/biru, melainkan “nomor antrian” yang merujuk ke tabel warna di dalam chip DAC (Digital-to-Analog Converter) kartu grafis.
Bedah Register (Assembly BIOS – Mode 13h):
; 1. Mengaktifkan Mode Grafik
MOV AH, 0x00 ; Fungsi: Set Video Mode
MOV AL, 0x13 ; Mode: 320x200, 256 warna
INT 0x10 ; Trap ke BIOS
; 2. Persiapan Menulis Pixel
MOV AX, 0xA000 ; Segmen memori VGA
MOV ES, AX ; Load ke Extra Segment (ES)
; 3. Menulis Pixel di Kiri Atas (Offset 0)
XOR DI, DI ; Destination Index = 0
MOV AL, 0x04 ; Warna Indeks 4 (Biasanya Merah di palet default)
MOV [ES:DI], AL ; Tulis byte ke 0xA000:0000
2.2. VESA VBE & The “Bank Switching” Nightmare
Ketika industri menuntut resolusi tinggi (SVGA/XGA) di atas sistem DOS/BIOS, VESA (Video Electronics Standards Association) menciptakan standar VBE. Namun, karena CPU Real Mode tetap tidak bisa melihat memori video GPU yang besar (misal 2 MB), VESA menggunakan teknik Bank Switching.
- Konsep Jendela: CPU tetap hanya melihat jendela 64 KB di 0xA0000.
- Mekanisme: Memori video GPU dibagi-bagi menjadi potongan-potongan (“Banks”) berukuran 64 KB.
- Operasi Penulisan: Jika kita ingin menulis pixel di bagian bawah layar (yang berada di luar 64 KB pertama), kita harus memerintahkan kartu grafis untuk “menggeser” jendela 0xA0000 agar menunjuk ke Bank 1, Bank 2, dst.
Bedah Register (Assembly BIOS – VESA Bank Switch):
Ini adalah operasi yang sangat mahal secara performa (High Latency) karena melibatkan interupsi di tengah proses menggambar.
; Misal kita ingin menulis ke alamat linear 70.000 (Bank 1)
; 1. Ganti Bank (Context Switch Window)
MOV AX, 0x4F05 ; Fungsi VESA: Window Control
MOV BH, 0x00 ; Set Window A
MOV DX, 0x01 ; Pilih Bank nomor 1 (64KB kedua)
INT 0x10 ; CALL BIOS (CPU Berhenti sebentar di sini!)
; 2. Hitung Offset Relatif
; Offset = 70.000 - 65.536 = 4.464
MOV AX, 0xA000
MOV ES, AX
MOV DI, 4464
MOV AL, 0x0F ; Warna Putih
MOV [ES:DI], AL ; Tulis pixel
Bayangkan operasi INT 0x10 ini harus dipanggil ratusan kali per detik saat menggambar gambar kompleks. Inilah penyebab utama lambatnya grafis di era DOS akhir.
3. UEFI: Era Graphics Output Protocol (GOP)
UEFI menghapus total konsep Bank Switching dan Palette. Karena UEFI berjalan di Long Mode (64-bit), CPU memiliki kapabilitas pengalamatan memori hingga 16 Exabytes. Seluruh memori video GPU (VRAM)—baik itu 4 GB atau 24 GB—dapat dipetakan secara langsung dan utuh ke dalam RAM sistem. Inilah yang disebut Linear Framebuffer (LFB).
3.1. Protokol GOP
UEFI tidak menggunakan interupsi. Akses grafis dilakukan melalui struktur data EFI_GRAPHICS_OUTPUT_PROTOCOL (GOP). Pengembang menggunakan fungsi LocateProtocol untuk mendapatkan pointer ke struktur ini.
Data terpenting dalam struktur GOP adalah:
- FrameBufferBase: Alamat fisik 64-bit absolut di mana VRAM dimulai (Contoh: 0xE0000000).
- PixelsPerScanLine: Jumlah pixel per baris (Penting untuk menghitung padding).
- PixelFormat: Format warna (Biasanya PixelBlueGreenRedReserved8BitPerColor).
3.2. True Color (Direct Memory Access)
Pixel di UEFI disimpan dalam format 32-bit (4 Byte). Tidak ada lagi palet atau DAC. Jika Anda ingin warna merah, Anda menulis nilai heksadesimal merah langsung ke memori.
Analisis Alamat Memori (UEFI):
Rumus untuk menemukan alamat memori sebuah pixel di koordinat (X, Y) adalah:
Address = Base + (Y * PixelsPerScanLine * 4) + (X * 4)
(Dikali 4 karena setiap pixel ukurannya 4 byte).
Bedah Kode (C/Assembly UEFI – Linear Write):
Perhatikan tidak ada interupsi INT sama sekali. Ini murni operasi memori (Memory Mapped I/O).
// Definisi Pointer ke Memori Video (LFB)
// Kita cast alamat fisik Base menjadi pointer integer 32-bit
UINT32* VideoMem = (UINT32*)(Gop->Mode->FrameBufferBase);
// Kalkulasi Offset Linear
UINT32 Pitch = Gop->Mode->Info->PixelsPerScanLine;
UINT32 Offset = (Y * Pitch) + X;
// Tulis Warna Langsung (Format 0x00RRGGBB atau 0x00BBGGRR)
VideoMem[Offset] = 0x00FF0000; // Merah Murni
4. Analisis Komparatif: Instruksi Mesin (Opcode Level)
Mari kita bandingkan instruksi yang dieksekusi prosesor saat melakukan operasi “Plot Pixel” pada kedua arsitektur. Ini menunjukkan perbedaan efisiensi yang ekstrem.
Skenario BIOS (VESA Banked)
Sangat tidak efisien karena percabangan logika dan interupsi.
| Urutan | Instruksi Assembly | Keterangan Teknis |
| 1. | MUL / DIV | Menghitung posisi Bank dan Offset. |
| 2. | CMP DX, [LastBank] | Cek apakah Bank berubah dari pixel sebelumnya. |
| 3. | JE SkipSwitch | Jika Bank sama, lompat. Jika beda, lanjut. |
| 4. | MOV AX, 0x4F05 | Siapkan fungsi VESA. |
| 5. | INT 0x10 | CONTEXT SWITCH FIRMWARE. CPU menyimpan state, lompat ke ROM, ganti register hardware VGA, lalu kembali (IRET). (Sangat Lambat) |
| 6. | MOV [ES:DI], AL | Akhirnya, menulis data pixel. |
Skenario UEFI (Linear Framebuffer)
Sangat efisien, ramah terhadap Pipeline CPU dan Cache.
| Urutan | Instruksi Assembly | Keterangan Teknis |
| 1. | IMUL RAX, [Pitch] | Kalkulasi baris Y. |
| 2. | LEA RDI, [Base + RAX4 + X4] | Kalkulasi alamat fisik final dalam satu instruksi LEA (Load Effective Address). |
| 3. | MOV [RDI], ECX | DIRECT WRITE. Data langsung dikirim ke Bus PCIe menuju GPU. |
5. Implikasi bagi Pengembang Kernel OS
- Hardware Abstraction Layer (HAL):
- Di era BIOS, kernel OS Anda harus memuat driver khusus untuk setiap kartu grafis (S3, Trident, ATI, NVIDIA) hanya untuk mendapatkan resolusi tinggi, karena VESA sering kali lambat atau buggy.
- Di era UEFI, GOP bertindak sebagai HAL universal. Kernel Anda tidak perlu tahu merek GPU-nya. Selama GPU itu mematuhi standar UEFI, kernel cukup membaca FrameBufferBase dan layar akan menyala dengan resolusi native monitor.
- Boot Seamless:
- Karena menggunakan LFB, kernel dapat mempertahankan gambar terakhir yang digambar oleh Bootloader (misalnya Logo Vendor) tanpa kedipan (flicker), karena kernel cukup melanjutkan menulis ke alamat memori yang sama.
- Akses Konkuren:
- Pada BIOS, karena menggunakan port I/O dan register VGA global, sulit bagi OS multitasking untuk menggambar ke layar secara paralel.
- Pada UEFI, karena LFB hanyalah memori RAM biasa, kernel bisa menggunakan teknik multithreading untuk mengisi bagian atas dan bawah layar secara bersamaan menggunakan core CPU yang berbeda.
