Dalam pengembangan Operating System (OS) tipe bare-metal, kita bekerja langsung di atas perangkat keras tanpa bantuan sistem operasi perantara. Di sinilah Linker Script memegang peranan vital. Ia bukan sekadar kode tambahan, melainkan sebuah instruksi strategis yang menentukan bagaimana memori sistem akan dikelola dan di mana setiap instruksi program akan diletakkan.
Artikel ini akan membahas secara mendalam konfigurasi linker.ld untuk Raspberry Pi 1 (BCM2835) dan bagaimana hubungannya dengan struktur RAM pada perangkat tersebut.
1. Mengenal Linker Script (linker.ld)
Linker script adalah file konfigurasi yang digunakan oleh linker (bagian dari compiler toolchain) untuk menggabungkan berbagai file objek (.o) menjadi satu file biner tunggal (seperti kernel.img).
Berikut adalah struktur linker.ld sederhana namun fungsional yang digunakan untuk menginisialisasi Raspberry Pi 1:
/* linker.ld - Struktur Dasar Kernel Raspberry Pi 1 */
SECTIONS
{
/* 1. Menetapkan Kernel di alamat 0x8000 */
. = 0x8000;
/* 2. Bagian Kode Instruksi */
.text : {
KEEP(*(.text.boot)) /* Memastikan kode boot tidak terhapus */
*(.text) /* Seluruh instruksi program lainnya */
}
/* 3. Bagian Data Terinisialisasi */
.data : {
*(.data)
}
/* 4. Bagian Data Tidak Terinisialisasi */
.bss : {
*(.bss)
}
}
Penjelasan Komponen Script:
SECTIONS: Blok utama yang mendefinisikan tata letak memori output.. = 0x8000;: Ini disebut sebagai Location Counter. Baris ini memerintahkan linker untuk memulai penempatan kode pada alamat memori 0x8000. Pada Raspberry Pi 1, alamat ini adalah lokasi standar di mana firmware GPU memuat kernel ke dalam RAM..text: Bagian yang menampung instruksi kode program.KEEP(*(.text.boot)): Perintah ini sangat krusial. Ia memaksa linker untuk tetap menyertakan bagianboot(biasanya ditulis dalam Assembly) di posisi paling awal. Tanpa ini, linker mungkin akan membuang kode tersebut jika dianggap tidak dipanggil oleh fungsi lain.
.data: Menyimpan variabel global atau statis yang sudah memiliki nilai awal (misalnya:int status = 1;)..bss: Menyimpan variabel global yang belum diberi nilai awal atau bernilai nol. Area ini harus dibersihkan (di-nol-kan) saat proses booting agar sistem berjalan stabil.
2. Visualisasi RAM Memory Map
Untuk memahami mengapa kita memilih alamat-alamat tertentu di dalam linker script, kita harus melihat bagaimana RAM Raspberry Pi 1 dipetakan secara fisik.
Peta Memori (RAM Map)
| Alamat Memori | Komponen | Deskripsi |
| 0x00000000 | Vector Table & Stack | Digunakan untuk penanganan interupsi. Area di bawah 0x8000 biasanya digunakan untuk Stack (tumbuh ke bawah). |
| 0x00008000 | Kernel Entry | Titik awal instruksi .text.boot. Di sinilah OS kita mulai bernapas. |
| 0x00008000+ | Kernel Body | Area tempat .text, .data, dan .bss diletakkan secara berurutan. |
| Sisa RAM | Free RAM / Heap | Ruang kosong yang dapat digunakan untuk alokasi memori dinamis (malloc). |
| 0x20000000 | Peripherals | Bukan RAM fisik, melainkan alamat Memory Mapped I/O (GPIO, UART, dll). |
Struktur Visual:
0x00000000 ┬───────────────────────┐
│ Vector Table / Stack │
0x00008000 ┼───────────────────────┤ ← Start of Kernel
│ .text (Instructions) │
├───────────────────────┤
│ .data (Init Variables)│
├───────────────────────┤
│ .bss (Zero Variables)│
├───────────────────────┤
│ Available RAM (Heap) │
0x20000000 ┴───────────────────────┘ ← Peripheral Base
3. Pentingnya Sinkronisasi antara Kode dan Memori
Memahami linker.ld adalah kunci untuk menghindari kernel panic atau perilaku sistem yang tidak terduga. Beberapa poin penting yang perlu diperhatikan pengembang adalah:
- Penempatan Stack: Karena Stack tumbuh ke arah bawah (alamat yang lebih kecil), menempatkan Stack Pointer di alamat
0x8000adalah praktik umum karena ia akan menggunakan ruang kosong di bawah kernel tanpa menimpa kode program itu sendiri. - Peripheral Access: Alamat
0x20000000pada Raspberry Pi 1 adalah pintu gerbang untuk berinteraksi dengan perangkat keras. Segala komunikasi dengan lampu LED (GPIO) atau pengiriman data teks (UART) dilakukan dengan mengakses alamat di area ini. - Inisialisasi BSS: Salah satu tugas pertama kode boot kita adalah memastikan area
.bssdiisi dengan angka nol. Jika tidak, variabel yang tidak terinisialisasi akan berisi data “sampah” dari sisa proses sebelumnya.
Kesimpulan
Linker script bukan sekadar file pendukung, melainkan fondasi yang menentukan integritas sistem operasi bare-metal. Dengan menentukan titik muat di 0x8000 dan mengorganisir bagian teks serta data dengan benar, kita memastikan bahwa perangkat keras Raspberry Pi dapat mengeksekusi visi perangkat lunak kita dengan tepat.
