Oleh: Reza Ervani bin Asmanu
Dalam pemrograman aplikasi tingkat tinggi, kita dimanjakan oleh memori virtual yang dikelola oleh OS. Kita bisa meminta memori kapan saja (malloc) tanpa peduli di mana data itu disimpan secara fisik. Namun, dalam pengembangan Sistem Operasi bare metal, kita berhadapan langsung dengan alamat fisik perangkat keras.
Raspberry Pi 1 menggunakan SoC (System on Chip) Broadcom BCM2835. Prosesor ini memiliki bus alamat 32-bit, yang secara teori mampu mengalamatkan hingga 4GB ruang memori. Namun, realitas fisiknya terbagi menjadi dua wilayah besar: SDRAM (Memori Utama) dan Memory Mapped I/O (Peripherals).
Berikut adalah peta memori fisik yang dilihat oleh inti CPU ARM1176JZF-S saat sistem baru menyala (MMU non-aktif).
1. Visualisasi Peta Memori
Secara sederhana, ruang alamat pada Raspberry Pi 1 (Model B dengan 512MB RAM) terbagi sebagai berikut:
0xFFFFFFFF +-----------------------+
| |
| Tidak Terjangkau |
| (Bus Address Space) |
| |
0x20FFFFFF +-----------------------+ <--- Batas Akhir Peripheral
| |
| PERIPHERALS (I/O) |
| (GPIO, UART, Timer) |
| |
0x20000000 +-----------------------+ <--- BASE PERIPHERAL (Penting!)
| |
| |
| GPU RAM | (VideoCore IV)
| (Diatur di config.txt)|
| |
0x1C000000 +-----------------------+ (Contoh jika GPU split 64MB)
| |
| |
| ARM RAM | (Sisa RAM untuk OS Kita)
| (Heap / Stack) |
| |
| |
0x00008000 +-----------------------+ <--- ENTRY POINT (kernel.img)
| ARM KERNEL |
0x00004000 +-----------------------+ <--- L1 Page Tables (Biasanya)
| |
0x00000100 +-----------------------+ <--- ATAGS (Parameter Boot)
| |
0x00000000 +-----------------------+ <--- EXCEPTION VECTOR TABLE
2. Bedah Wilayah Memori
Mari kita bahas zona-zona kritis dari alamat terendah (0x00000000) hingga ke atas.
A. Zona Sakral: Exception Vector Table (0x00000000)
Alamat paling awal di memori, yaitu 0x00 hingga 0x20, dicadangkan untuk Tabel Vektor Pengecualian.
Jika CPU mengalami kejadian luar biasa (misalnya: instruksi ilegal, interrupt dari hardware, atau tombol reset ditekan), CPU akan secara otomatis melompat ke alamat ini.
- Saat ini kita belum menggunakannya, tapi nanti kita wajib mengisi alamat ini untuk menangani interupsi (misalnya input keyboard).
B. ATAGS (0x00000100)
Pada alamat ini, bootloader GPU biasanya meletakkan informasi parameter sistem (ATAGS), seperti berapa jumlah memori yang tersedia dan command line kernel. OS modern menggunakan Device Tree (DTB), tapi teknik bare metal klasik sering merujuk ke sini.
C. Kernel Load Address (0x00008000)
Ini adalah “Rumah Kita”. Seperti yang diatur di linker.ld, kode boot.S dan main.c kita diletakkan mulai dari titik ini.
- Mengapa 0x8000? Ini adalah standar de-facto dari bootloader Linux pada ARM. Ruang di bawahnya (0x0000 – 0x7FFF) dibiarkan kosong untuk menampung tabel vektor, stack awal, dan parameter boot.
D. System RAM (Free Memory)
Area di atas kernel (> 0x8000 + ukuran kernel) adalah memori bebas.
- Di sinilah kita meletakkan Stack (yang tumbuh ke bawah menuju kernel).
- Di sinilah nanti kita mengalokasikan Heap (memori dinamis untuk data aplikasi).
- Penting: Bagian paling atas dari RAM fisik diambil oleh GPU. Besarnya tergantung pengaturan
gpu_memdiconfig.txt. Jika RAM total 512MB dan GPU mengambil 64MB, maka OS kita hanya boleh menyentuh memori sampai batas 448MB.
E. Memory Mapped I/O (0x20000000)
Inilah perbedaan terbesar Raspberry Pi 1 dengan versi yang lebih baru (Pi 2/3/4).
Pada BCM2835 (Pi 1), alamat dasar untuk mengendalikan perangkat keras (GPIO, Timer, UART) dimulai di 0x20000000.
Catatan Kritis:
Dalam dokumentasi resmi Broadcom (BCM2835 ARM Peripherals Datasheet), alamat yang tertulis seringkali 0x7E000000. Jangan terkecoh!
0x7E...adalah alamat Bus (yang dilihat oleh GPU).0x20...adalah alamat Fisik (yang dilihat oleh CPU ARM kita).Inilah alasan mengapa di kode main.c kita mendefinisikan:
#define PERIPHERAL_BASE 0x20000000
Di dalam wilayah ini terdapat register-register vital:
- GPIO Controller: Offset
0x200000(Alamat0x20200000) - System Timer: Offset
0x003000(Alamat0x20003000) - UART0 (PL011): Offset
0x201000(Alamat0x20201000)
Kesimpulan
Bagi seorang pengembang OS bare metal di Raspberry Pi 1, angka keramat yang harus dihafal di luar kepala adalah:
0x8000: Titik awal kode kita berjalan.0x20000000: Pintu gerbang menuju pengendalian perangkat keras (Peripheral Base).
Salah satu bit saja dalam mendefinisikan alamat ini, maka kita tidak sedang menulis ke pengendali lampu LED, melainkan menulis ke memori antah-berantah yang bisa menyebabkan sistem terhenti (hang).
