Oleh: Reza Ervani bin Asmanu
Dalam alur inisialisasi sistem operasi, terdapat satu titik krusial yang menandai perpindahan “tongkat estafet” dari kode bootloader (Assembly) menuju kernel utama (Bahasa C). Pada kode boot.S yang kita bangun, momen tersebut direpresentasikan oleh satu baris instruksi singkat:
bl main
Secara teknis, ini terlihat seperti lompatan biasa. Namun, di balik layar, instruksi bl (Branch with Link) melakukan serangkaian mekanisme register yang memungkinkan konsep “fungsi” dan “subrutin” dapat bekerja. Artikel ini akan membedah anatomi instruksi tersebut.
1. Definisi: Branch vs Branch with Link
Dalam arsitektur ARM, terdapat dua cara utama untuk memindahkan aliran eksekusi program (melakukan lompatan) ke alamat memori lain:
A. Branch (b)
Ini adalah lompatan satu arah.
- Analogi: Seseorang pergi meninggalkan rumah dan tidak berniat kembali, atau tidak mencatat alamat rumahnya.
- Perilaku: CPU hanya mengubah nilai Program Counter (PC) ke alamat tujuan. CPU “lupa” dari mana ia berasal.
- Penggunaan: Digunakan untuk loops (perulangan) atau lompatan kondisional (seperti
if-else).
B. Branch with Link (bl)
Ini adalah lompatan dua arah (pemanggilan fungsi).
- Analogi: Seseorang pergi merantau, tetapi ia menyimpan tiket pulang di saku bajunya agar bisa kembali ke rumah setelah urusannya selesai.
- Perilaku: Sebelum melompat, CPU menyimpan alamat instruksi berikutnya ke dalam Link Register (LR).
- Penggunaan: Digunakan untuk memanggil Subrutin atau Fungsi.
2. Mekanisme “Link” dan Peran Register LR
Saat instruksi bl main dieksekusi, prosesor melakukan dua tugas secara simultan (atomik):
- Tugas Branch (Lompat):Prosesor mengisi Program Counter (PC) dengan alamat memori di mana fungsi main berada. Ini menyebabkan instruksi selanjutnya yang akan dieksekusi adalah baris pertama dari kode C main().
- Tugas Link (Catat):Sebelum melompat, prosesor mencatat alamat instruksi setelah bl ini ke dalam Register R14 (Link Register / LR).
- Jika
bl mainada di alamat0x8004, maka alamat0x8008(instruksi selanjutnya) disimpan di LR. - Tujuannya adalah agar nanti, jika fungsi
main()selesai dan melakukan perintahreturn, prosesor tahu jalan pulang dengan membaca LR.
- Jika
Meskipun dalam OS sederhana kita ini fungsi main() dirancang dengan infinite loop (while(1)) dan tidak akan pernah kembali, penggunaan bl adalah standar baku (ABI – Application Binary Interface) untuk memanggil fungsi C. Ini memberikan struktur yang valid bagi compiler.
3. Resolusi Simbol: Siapa itu “main”?
Saat kita menulis bl main, Assembler sebenarnya belum tahu di angka berapa alamat main berada.
- Peran Assembler: Ia menandai
mainsebagai “Simbol Eksternal” (sesuatu yang ada di luar fileboot.S). - Peran Linker: Nanti, saat proses linking, Linker akan melihat file
main.cyang sudah dikompilasi, menemukan fungsi bernamamain, menghitung alamat memorinya (misalnya di0x8040), dan mengganti labelmaindi kode assembly tadi dengan alamat0x8040.
4. Perubahan Lingkungan (Environment Switch)
Momen eksekusi bl main adalah garis demarkasi yang tegas.
Sebelum bl main (Dunia Assembly):
- Kita harus mengatur setiap register secara manual (
mov,ldr). - Tidak ada konsep variabel lokal yang otomatis.
- Kita bekerja langsung dengan instruksi mesin mentah.
Setelah bl main (Dunia C):
- CPU mulai mengeksekusi kode yang dihasilkan oleh GCC dari
main.c. - Kita bisa menggunakan logika tingkat tinggi:
if,while,for. - Kita bisa menggunakan tipe data:
int,char,struct. - Manajemen register ditangani otomatis oleh Compiler.
Kesimpulan
Instruksi bl main bukan sekadar perintah lompat. Ia adalah mekanisme delegasi.
Dengan instruksi ini, boot.S berkata: “Tugasku menyiapkan memori dan stack sudah selesai. Sekarang, saya serahkan kendali penuh kepadamu, wahai Kernel C, untuk menjalankan logika sistem operasi. Saya (bootloader) akan menunggu di sini (di Link Register) kalau-kalau engkau selesai.”
Inilah awal mula sistem operasi kita benar-benar “hidup” dan menjalankan logika yang kita rancang.
