Tutorial Oleh : Reza Ervani bin Asmanu
Pernahkah Anda bertanya-tanya, apa yang terjadi tepat setelah komputer dinyalakan, sebelum logo Windows atau Linux muncul?
Sebagai programmer, kita terbiasa hidup nyaman di atas Sistem Operasi. Kita punya manajemen memori, file system, dan driver yang siap pakai. Tapi, bagaimana jika kita cabut semua itu? Bagaimana jika hanya ada kode kita dan perangkat keras (hardware), berhadapan langsung satu lawan satu?
Inilah yang disebut Bare Metal Programming.
Hari ini, kita akan melakukan “Hello World” dalam pengembangan OS menggunakan perangkat legendaris: Raspberry Pi 1 (Model B). Tujuan kita sederhana: Menyalakan lampu LED tanpa menggunakan Linux, tanpa Python, dan tanpa C library. Murni Assembly.
Mengapa Raspberry Pi 1?
Di era Raspberry Pi 4 atau 5 yang super cepat, kenapa kita mundur ke versi tahun 2012?
- Arsitektur Sederhana: RPi 1 menggunakan chip BCM2835 (ARMv6) single-core. Jauh lebih mudah dipahami daripada multi-core modern.
- Dokumentasi Melimpah: Karena sudah tua, “rahasia” hardware-nya sudah terbedah habis oleh komunitas.
Persiapan “Alat Tempur”
Sebelum mulai, pastikan Anda memiliki:
- Raspberry Pi 1 Model B (atau B+).
- SD Card (format FAT32).
- Linux Environment (Bisa pakai Ubuntu native atau WSL di Windows) untuk melakukan compile.
Kita perlu menginstall ARM Cross-Compiler. Di terminal Ubuntu/Debian, ketik:
sudo apt update
sudo apt install binutils-arm-none-eabi
Kita hanya butuh binutils (assembler dan linker) untuk tahap awal ini.
Konsep: Memory Mapped I/O
Di Raspberry Pi, kita tidak punya fungsi digitalWrite(16, HIGH). CPU berkomunikasi dengan perangkat luar (seperti LED) dengan cara menulis angka ke alamat memori tertentu.
Untuk RPi 1 (Chip BCM2835):
- Base Address Peripheral ada di
0x20000000. - Kontroler GPIO ada di offset
0x200000. - Jadi, alamat GPIO ada di
0x20200000.
LED indikator “OK” (warna hijau) pada RPi 1 biasanya terhubung ke GPIO 16. Uniknya, pada model lama ini, sirkuitnya Active Low (Diberi nilai 0 dia nyala, diberi 1 dia mati).
Kode: The First Breath
Buatlah sebuah file bernama main.s. Ini adalah kode Assembly ARM. Apa fungsi tiap barisnya, bisa anda baca pada bagian komentar yang saya berikan
Cuplikan kode
/* main.s - Menyalakan OK LED di Raspberry Pi 1
Target: GPIO 16 (Active Low pada RPi 1 Model B Rev 2)
*/
/* Alamat Dasar GPIO untuk BCM2835 (RPi 1) */
.equ GPIO_BASE, 0x20200000
/* Offset Register */
.equ GPFSEL1, 0x04 /* Register untuk mengatur mode Pin 10-19 */
.equ GPSET0, 0x1C /* Register untuk menyalakan Pin (Output High) */
.equ GPCLR0, 0x28 /* Register untuk mematikan Pin (Output Low) */
.section .text
.global _start
_start:
/* 1. Load Alamat GPIO Base ke Register r0 */
ldr r0, =GPIO_BASE
/* 2. Mengatur GPIO 16 sebagai OUTPUT
Kita perlu memodifikasi register GPFSEL1.
GPIO 16 dikontrol oleh bit 18-20 di register ini.
Kita harus set bit tersebut menjadi '001' (binary) untuk mode Output.
*/
ldr r1, [r0, #GPFSEL1] /* Baca kondisi GPFSEL1 saat ini */
bic r1, r1, #(7 << 18) /* Bersihkan (Clear) bit 18-20 */
orr r1, r1, #(1 << 18) /* Set bit 18 menjadi 1 (Mode Output) */
str r1, [r0, #GPFSEL1] /* Tulis kembali ke memori */
loop:
/* 3. Menyalakan LED
Ingat: Di RPi 1, LED OK itu Active Low (0 = Nyala).
Jadi kita gunakan GPCLR0 (Clear) untuk membuatnya jadi 0 (Ground).
*/
mov r1, #(1 << 16) /* Siapkan bit ke-16 */
str r1, [r0, #GPCLR0] /* Tulis ke register Clear -> LED NYALA */
/* Delay sebentar */
bl delay
/* 4. Mematikan LED
Gunakan GPSET0 (Set) untuk membuatnya jadi 1 (VCC) -> LED Mati.
*/
mov r1, #(1 << 16)
str r1, [r0, #GPSET0] /* Tulis ke register Set -> LED MATI */
/* Delay sebentar */
bl delay
/* Ulangi selamanya */
b loop
/* Fungsi Delay Sederhana (Loop kosong) */
delay:
ldr r2, =0xF0000 /* Angka besar untuk counter */
wait:
sub r2, r2, #1 /* Kurangi 1 */
cmp r2, #0 /* Cek apakah sudah 0? */
bne wait /* Jika belum, ulang wait */
bx lr /* Kembali ke pemanggil */
Tahap Build: Dari Teks Menjadi Biner
Komputer (CPU) tidak mengerti teks di atas. Kita harus menerjemahkannya.
- Assemble (Ubah kode menjadi object file):Bash
arm-none-eabi-as main.s -o main.o - Extract Binary (Ambil kode mesin murninya saja, buang label/header):Bash
arm-none-eabi-objcopy main.o -O binary kernel.img
Selamat! File kernel.img adalah “Sistem Operasi” Anda.
Tahap Eksekusi
- Siapkan SD Card kosong.
- Anda membutuhkan file bootloader standar Raspberry Pi agar GPU bisa bangun. Unduh file berikut dari repo resmi Raspberry Pi (atau salin dari installan Raspbian lama):
bootcode.binstart.elf
- Copy
bootcode.bin,start.elf, dan filekernel.imgbuatan Anda tadi ke dalam SD Card. - Masukkan ke Raspberry Pi 1, lalu colok power.
Hasilnya:
Jika sukses, lampu hijau (OK/ACT) di board akan berkedip secara ritmis. Itu adalah detak jantung kode Anda, yang berjalan sendirian menguasai seluruh hardware tanpa campur tangan sistem operasi lain.
Apa Selanjutnya?
Ini baru langkah bayi (baby steps). Perjalanan membuat OS masih panjang: menyiapkan stack pointer, masuk ke mode C, membuat driver UART (untuk print text), hingga manajemen memori.
Tapi untuk sekarang, nikmatilah kedipan lampu itu. You have taken control.
