Navigasi Memori Bare Metal: Memahami Hubungan Base Address dan Register Offset pada Arsitektur BCM2835

Oleh: Reza Ervani bin Asmanu

Dalam pengembangan sistem operasi bare metal, kemampuan membaca lembar spesifikasi (datasheet) dan menerjemahkannya menjadi alamat memori adalah keterampilan fundamental. Seringkali, pengembang pemula merasa bingung saat dihadapkan pada berbagai tabel yang terpisah dalam dokumentasi perangkat keras (seperti BCM2835 ARM Peripherals).

Artikel ini akan membedah logika “Navigasi Memori” dengan menganalisis hubungan antara Base Address (Alamat Dasar) dan Offset (Jarak Geser). Pemahaman ini krusial untuk memanipulasi perangkat kerasโ€”seperti GPIO, UART, atau Timerโ€”langsung dari kode C.

Konsep Dasar: Peta Kota dan Denah Gedung

Untuk memahami bagaimana CPU melihat periferal, kita dapat menggunakan analogi hierarkis: hubungan Induk (Parent) dan Anak (Child), atau lebih visual lagi, hubungan antara Peta Kota dan Denah Gedung.

Lihat artikel : Peta Alamat Fisik Periferal Processor BCM2835 dan Bedah Anatomi Register GPIO: Mengapa Pin 16 Ada di GPFSEL1?

CPU tidak mengenal nama “GPIO” atau “UART”. CPU hanya memahami satu hal: Alamat Memori Absolut. Untuk mendapatkan alamat absolut tersebut, kita harus menggabungkan dua informasi dari dua tabel yang berbeda.

1. Pandangan Makro: Peta Periferal (The City Map)

Tabel pertama yang biasa kita temukan di dokumentasi adalah Peripheral Map. Tabel ini membagi wilayah memori utama (mulai dari 0x20000000 pada Raspberry Pi 1) menjadi kavling-kavling besar berdasarkan fungsinya.

Bayangkan ini sebagai Peta Kota. Setiap periferal (GPIO, Timer, Serial) adalah sebuah “Gedung” yang memiliki alamat jalan utama.

Contoh pada BCM2835:

  • Periferal: GPIO Controller
  • Offset Periferal: 0x200000
  • Physical Base Address: 0x20200000

Interpretasi:

Informasi ini memberi tahu kita lokasi gedung utama. “Jika ingin mengakses fitur input/output pin, pergilah ke gedung yang beralamat di 0x20200000.”

2. Pandangan Mikro: Peta Register (The Building Blueprint)

Setelah mengetahui lokasi gedungnya, kita membutuhkan tabel kedua: Register Map. Tabel ini menjelaskan detail internal dari periferal tersebut. Tabel ini hanya berlaku dan bermakna jika kita sudah berada di dalam wilayah memori periferal terkait.

Bayangkan ini sebagai Denah Lantai atau nomor ruangan di dalam gedung tadi.

Contoh Register GPFSEL1 (GPIO Function Select 1):

  • Nama Register: GPFSEL1
  • Offset Register: 0x04
  • Fungsi: Mengontrol mode (Input/Output) untuk Pin 10 hingga Pin 19.

Interpretasi:

Informasi ini memberi tahu kita lokasi spesifik saklarnya. “Di dalam gedung GPIO, saklar untuk mengatur Pin 16 berada di ruangan dengan jarak (offset) 0x04 meter dari pintu masuk utama.”


Formulasi Matematika: Menghitung Alamat Mutlak

Kunci dari pemrograman driver adalah menyatukan kedua informasi di atas menjadi satu alamat yang bisa dipahami oleh pointer bahasa C. Rumus universalnya adalah:

Alamat Mutlak=Base Address Periferal+Offset Register\text{Alamat Mutlak} = \text{Base Address Periferal} + \text{Offset Register}

Mari kita terapkan rumus ini pada dua studi kasus nyata.

Studi Kasus A: Mengontrol LED pada Raspberry Pi 1

Pada Raspberry Pi 1, LED indikator (ACT) terhubung pada GPIO 16. Kita perlu mengatur pin ini menjadi mode Output. Karena GPIO 16 berada dalam rentang Pin 10-19, kita membutuhkan register GPFSEL1.

  1. Identifikasi Base Address (Tabel Makro):Gedung GPIO berada di 0x20200000.
  2. Identifikasi Offset (Tabel Mikro):Register GPFSEL1 memiliki offset 0x04.
  3. Kalkulasi :
0x20200000+0x04=๐ŸŽ๐ฑ๐Ÿ๐ŸŽ๐Ÿ๐ŸŽ๐ŸŽ๐ŸŽ๐ŸŽ๐Ÿ’0x20200000 + 0x04 = \mathbf{0x20200004}

Inilah alasan mengapa dalam kode C (main.c), kita mendefinisikan pointer ke alamat 0x20200004 untuk memanipulasi GPIO 16.

Studi Kasus B: Migrasi ke Raspberry Pi Zero (Pin 47)

Misalkan kita memindahkan kode ke Raspberry Pi Zero W, di mana LED indikator pindah ke GPIO 47. Apakah alamatnya berubah?

  1. Identifikasi Base Address (Tabel Makro):Lokasi gedung GPIO tidak berubah, tetap di 0x20200000.
  2. Identifikasi Offset (Tabel Mikro):Karena target kita adalah Pin 47, kita harus melihat tabel register mana yang mengontrol rentang Pin 40-49. Jawabannya adalah register GPFSEL4.Register GPFSEL4 memiliki offset 0x10.
  3. Kalkulasi :
0x20200000+0x10=๐ŸŽ๐ฑ๐Ÿ๐ŸŽ๐Ÿ๐ŸŽ๐ŸŽ๐ŸŽ๐Ÿ๐ŸŽ0x20200000 + 0x10 = \mathbf{0x20200010}

Kesimpulan

Pemahaman tentang hubungan Parent (Base Address) dan Child (Register Offset) ini adalah pondasi utama. Tabel pertama memberi tahu kita “Di mana kompleknya”, sedangkan tabel kedua memberi tahu “Di mana tombolnya” di dalam komplek tersebut.

Seorang pengembang sistem operasi harus selalu membaca kedua tabel ini secara berpasangan. Dengan menguasai logika navigasi ini, kita dapat mengendalikan periferal apa punโ€”mulai dari menyalakan LED sederhana hingga mengatur komunikasi Serial UART yang kompleksโ€”dengan presisi tinggi.