Dalam perjalanan membangun Sistem Operasi Bare Metal (mandiri) di atas Raspberry Pi, kita sering memulai dengan keberhasilan sederhana: menyalakan LED. Ini adalah bukti bahwa kita memiliki kendali atas Output.
Namun, sebuah Sistem Operasi tidak hanya berbicara; ia harus mendengar. Agar OS dapat merespons ketikan keyboard, data dari sensor, atau paket jaringan, prosesor harus memiliki kemampuan untuk berhenti sejenak dari rutinitas utamanya dan menangani kejadian mendesak dari dunia luar. Mekanisme inilah yang disebut Interupsi.
Artikel ini akan membedah secara mendalam bagaimana prosesor ARMv6 (jantung Raspberry Pi 1) menangani interupsi melalui struktur data vital yang disebut Exception Vector Table.
1. Masalah Mendasar: CPU yang Sekuensial
Secara alami, CPU adalah pekerja yang sangat linear. Ia mengambil instruksi pertama, menjalankannya, lalu mengambil instruksi kedua, dan seterusnya. CPU tidak memiliki “mata” untuk melihat bahwa Anda baru saja menekan tombol keyboard.
Tanpa mekanisme interupsi, CPU harus melakukan teknik Polling (bertanya terus-menerus):
“Apakah tombol ditekan? Belum. Apakah tombol ditekan? Belum…”
Teknik ini sangat tidak efisien dan memboroskan daya komputasi. Solusi arsitekturnya adalah memberikan hak kepada perangkat keras (Hardware) untuk mencolek bahu CPU dan berkata, “Berhenti dulu, ada data masuk!”
2. Definisi Exception Vector Table
Ketika CPU menerima “colekan” (Interupsi/Exception), ia harus tahu ke mana ia harus melompat untuk menangani masalah tersebut. CPU tidak bisa menebak-nebak alamat memori.
Exception Vector Table adalah sebuah tabel standar yang berisi daftar alamat (pointer) atau instruksi lompatan. Tabel ini bertindak sebagai “Papan Switchboard Darurat”. Setiap jenis kejadian luar biasa (exception) memiliki nomor urut dan alamat yang pasti.
Pada arsitektur ARM, Vector Table ini wajib berada di alamat paling awal memori virtual, yaitu 0x00000000 (kecuali dikonfigurasi lain pada arsitektur yang lebih modern, namun pada RPi 1 standarnya adalah 0).
3. Anatomi Lengkap ARM Vector Table
Berikut adalah struktur utuh dari Vector Table pada prosesor ARM. Tabel ini terdiri dari 8 entri, di mana setiap entri berukuran 4-byte (32-bit).
| Alamat (Offset) | Tipe Exception / Vektor | Mode CPU Masuk | Deskripsi Teknis Lengkap |
0x00 | Reset | Supervisor (SVC) | Awal Kehidupan Sistem. Vektor ini dieksekusi saat listrik pertama kali dinyalakan atau tombol reset ditekan. Di sinilah Bootloader meletakkan kode inisialisasi awal (seperti setup Stack Pointer). |
0x04 | Undefined Instruction | Undefined (UND) | Penanganan Kode Rusak. Jika CPU mencoba membaca kode biner yang tidak dikenali (bukan instruksi ARM yang valid), CPU memicu exception ini. Ini sering terjadi jika Program Counter (PC) nyasar ke area data. |
0x08 | Software Interrupt (SWI) | Supervisor (SVC) | Gerbang System Call. Ini adalah satu-satunya cara aplikasi user (User Mode) meminta layanan Kernel. Aplikasi memanggil instruksi SWI atau SVC, dan CPU melompat ke sini untuk masuk ke mode Supervisor. |
0x0C | Prefetch Abort | Abort (ABT) | Error Ambil Instruksi. Terjadi jika CPU mencoba mengambil instruksi (fetch) dari alamat memori yang tidak valid atau dilarang (misal: memori yang tidak memiliki izin eksekusi). |
0x10 | Data Abort | Abort (ABT) | Error Baca/Tulis Data. Terjadi jika instruksi Load/Store (LDR/STR) mencoba mengakses alamat memori yang tidak valid (misal: menulis ke memori Read-Only atau area yang diproteksi MMU). |
0x14 | Reserved | – | Cadangan. Alamat ini dipesan oleh ARM untuk penggunaan masa depan dan biasanya berisi instruksi kosong atau loop tak terbatas. Sering disebut juga Hyp Trap pada arsitektur yang lebih baru. |
0x18 | IRQ (Interrupt Request) | IRQ Mode | Interupsi Standar. Inilah “jalur sibuk” OS. Semua perangkat keras umum (Keyboard, Timer, UART, Network) memicu vektor ini. OS bertugas memilah siapa pengirimnya. |
0x1C | FIQ (Fast Interrupt) | FIQ Mode | Interupsi Prioritas Tinggi. Mirip IRQ, tetapi memiliki prioritas lebih tinggi dan memiliki register perbankan (banked registers) lebih banyak agar proses context switching lebih cepat. Jarang digunakan untuk OS umum, biasanya untuk transfer data DMA spesifik. |
Penjelasan Mendalam tentang Mode CPU
Perhatikan kolom “Mode CPU Masuk”. Salah satu fitur pintar ARM adalah ketika terjadi exception, CPU tidak hanya melompat ke alamat vektor, tetapi juga mengganti “Topi” (Mode) secara otomatis.
- Saat kode biasa berjalan, CPU berada di User Mode atau System Mode.
- Saat Keyboard ditekan (IRQ), CPU otomatis melompat ke alamat
0x18DAN berubah menjadi IRQ Mode. - Di IRQ Mode, CPU memiliki register Stack Pointer (SP) tersendiri (
SP_irq). Ini mencegah penanganan interupsi merusak tumpukan data program utama yang sedang berjalan.
4. Studi Kasus: Perbedaan Offset 0x04
Dalam pemrograman low-level, pemahaman konteks alamat sangat krusial. Seringkali pengembang pemula bingung melihat angka offset yang sama di tempat berbeda. Mari kita bedah contoh Offset 0x04.
A. Pada Vector Table (0x00 + 0x04)
- Konteks: Memori Utama (RAM).
- Nama: Undefined Instruction Vector.
- Fungsi: Ini adalah alamat memori yang berisi kode instruksi lompat. Jika CPU sampai di sini, artinya ada kesalahan fatal dalam kode program (karena mencoba mengeksekusi data sampah). OS biasanya akan merespons ini dengan mematikan program tersebut (kill process) dan memberi pesan “Illegal Instruction”.
B. Pada Tabel GPIO (0x20200000 + 0x04)
- Konteks: Register Periferal (Hardware).
- Nama: GPFSEL1 (GPIO Function Select 1).
- Fungsi: Ini adalah saklar fisik untuk mengatur kaki-kaki prosesor. Offset ini mengontrol Pin 10 hingga 19.
- Perbedaan: Di sini,
0x04hanyalah jarak fisik dari gerbang GPIO. Isinya bukan kode program, melainkan data konfigurasi. Jika CPU mencoba mengeksekusi isi alamat ini, ia justru akan memicu Undefined Instruction (kembali ke poin A).
(Akhir dari Bagian 1. Pada Bagian 2, kita akan membahas Implementasi Teknis: Bagaimana menghubungkan Vector Table ini dengan Tabel Periferal, serta mengatasi masalah posisi memori 0x8000 vs 0x0000 pada Raspberry Pi.)
