Oleh: Reza Ervani bin Asmanu
Dalam pengembangan perangkat lunak tingkat aplikasi, ketika fungsi main() selesai dieksekusi (return 0), program akan ditutup dan kendali dikembalikan kepada Sistem Operasi (Windows/Linux). Namun, dalam pengembangan Sistem Operasi bare metal, kitalah otoritas tertinggi. Tidak ada entitas lain di atas kita.
Lantas, apa yang terjadi jika fungsi main() pada kernel kita selesai atau secara tidak sengaja melakukan return? CPU tidak memiliki instruksi bawaan untuk “berhenti bekerja” atau mematikan dirinya sendiri.
Untuk mencegah perilaku tak terdefinisi (undefined behavior) dan pemborosan energi, kita perlu mengimplementasikan mekanisme Safety Net atau Jaring Pengaman di akhir kode assembly kita.
1. Bahaya “Runaway CPU”
CPU bekerja berdasarkan siklus instruksi yang dikendalikan oleh Program Counter (PC). PC akan terus bertambah (increment) untuk mengambil instruksi berikutnya di memori.
Jika fungsi main selesai, PC akan menunjuk ke alamat memori setelah kernel.
- Zona Memori Kosong: Area ini mungkin berisi nilai
0x00000000atau data sampah acak. - Eksekusi Sampah: CPU akan mencoba menerjemahkan data sampah tersebut sebagai instruksi. Hal ini dapat memicu Undefined Instruction Exception, merusak data memori lain, atau menyebabkan perilaku perangkat keras yang tidak terprediksi (glitch).
Kondisi di mana CPU terus mengeksekusi memori di luar kendali program disebut Runaway CPU. Ini harus dicegah dengan segala cara.
2. Solusi Naif: Busy Wait Loop
Cara termudah untuk “menangkap” CPU adalah dengan membuat loop tak terbatas (infinite loop).
Cuplikan kode
halt:
b halt
Instruksi b (Branch) akan melompat kembali ke label halt secara terus menerus. Secara logika program, CPU terkunci di sini. Aman.
Namun, secara fisik, ini adalah bencana efisiensi. Dalam skenario ini, CPU bekerja 100% hanya untuk melompat ke tempat yang sama. Ini disebut Busy Waiting. Arus listrik terus mengalir deras ke transistor, menghasilkan panas berlebih, dan memboroskan daya baterai (jika menggunakan sumber daya portabel).
3. Solusi Elegan: Instruksi wfe (Wait For Event)
Arsitektur ARM menyediakan instruksi khusus untuk menangani kondisi diam ini dengan cerdas. Dalam kode boot.S, kita menulis:
Cuplikan kode
halt:
wfe
b halt
Mari kita bedah peran instruksi wfe:
Apa itu wfe?
wfe adalah singkatan dari Wait For Event. Instruksi ini memerintahkan inti prosesor untuk memasuki mode hemat daya (Low Power State).
Saat wfe dieksekusi:
- Clock Gating: Prosesor memutus atau memperlambat detak (clock) internal ke sebagian besar unit logika.
- Suspensi Eksekusi: Pipeline instruksi dihentikan. CPU berhenti mengambil (fetch) instruksi baru dari memori.
- Konsumsi Daya: Turun drastis hingga mendekati nol (mikro-ampere), tergantung implementasi chip.
Mengapa tetap butuh b halt?
Jika CPU sudah tidur, kenapa kita masih butuh perintah lompat b halt di bawahnya?
Jawabannya adalah karena CPU bisa terbangun. CPU akan bangun dari tidur wfe jika terjadi sebuah “Event”, misalnya:
- Sinyal interupsi dari perangkat keras (timer, keyboard, dll).
- Sinyal debug dari JTAG.
Jika CPU terbangun karena ada gangguan sinyal (spurious wake-up) padahal kita ingin OS tetap berhenti, maka eksekusi akan lanjut ke baris berikutnya.
Di baris berikutnya, instruksi b halt siap sedia untuk menangkap CPU yang baru bangun tersebut, dan melemparkannya kembali ke label halt (di mana ia akan disuruh tidur lagi oleh wfe).
4. Analisis Alur Logika (State Machine)
Mekanisme ini menciptakan sebuah mesin keadaan (state machine) yang sangat stabil:
- State ACTIVE: CPU masuk ke label
halt. - Transition: CPU mengeksekusi
wfe. - State SLEEP: CPU tidur (hemat daya).
- Event (Wake Up): Sesuatu membangunkan CPU.
- State ACTIVE: CPU bangun dan mengeksekusi baris selanjutnya (
b halt). - Action: CPU melompat kembali ke
halt. - Loop: Kembali ke langkah 2.
Kesimpulan
Blok kode penutup ini bukan sekadar formalitas.
Cuplikan kode
halt:
wfe
b halt
Ini adalah implementasi standar industri untuk Idle Loop. Dengan tiga baris ini, kita menjamin dua hal:
- Keamanan: CPU tidak akan pernah mengeksekusi kode sampah di luar batas program.
- Efisiensi: CPU tidak membakar energi listrik percuma saat tidak ada tugas yang perlu dikerjakan.
Dalam sistem operasi modern, mekanisme inilah yang terjadi saat komputer Anda sedang “diam” menunggu Anda menggerakkan mouse.
