Chapter 12 : Interrupts
Chapter 12
Interrupts
Interrupt
Interrupt pada keluarga mikroprosesor Intel memiliki dua pin perangkat keras untuk permintaan interrupt (INTR dan NMI) serta satu pin untuk mengakui interrupt melalui INTR. Selain itu, terdapat interrupt perangkat lunak (INT, INTO, INT 3, dan BOUND), dua flag (IF dan TF), serta instruksi khusus IRET/IRETD untuk kembali setelah interrupt.
Interrupt Vector
Vektor interrupt dan tabel vektor sangat penting untuk memahami interrupt perangkat keras maupun perangkat lunak. Tabel vektor interrupt terletak pada 1024 byte pertama memori di alamat 000000H–0003FFH. Tabel ini berisi 256 vektor interrupt yang masing-masing berukuran empat byte. Setiap vektor interrupt menyimpan alamat (segmen dan offset) dari prosedur layanan interrupt.
Figure 12-2 (a) The interrupt vector table for the microprocessor and (b) the contents of an interrupt vector.
Figure 12–2 menggambarkan tabel vektor interupsi untuk mikroprosesor. Lima vektor interupsi pertama identik pada semua anggota keluarga mikroprosesor Intel, mulai dari 8086 hingga Pentium. Vektor interupsi lainnya ada pada 80286 yang kompatibel ke atas dengan 80386, 80486, dan Pentium–Core2, tetapi tidak kompatibel ke bawah dengan 8086 atau 8088. Intel memesan 32 vektor interupsi pertama untuk digunakan dalam berbagai anggota keluarga mikroprosesornya. 224 vektor terakhir tersedia sebagai vektor interupsi untuk pengguna. Setiap vektor memiliki panjang empat byte dalam mode real dan berisi alamat awal dari prosedur layanan interupsi. Dua byte pertama dari vektor berisi alamat offset, sedangkan dua byte terakhir berisi alamat segmen.
Daftar berikut menjelaskan fungsi dari setiap interrupt
khusus pada mikroprosesor:
- TYPE 0 – Divide errorTerjadi setiap kali hasil dari operasi pembagian mengalami overflow atau ketika ada upaya melakukan pembagian dengan nol.
- TYPE 1 – Single-step atau trapTerjadi setelah eksekusi setiap instruksi apabila bit flag TF (Trap Flag) diatur (set). Setelah interrupt ini diterima, bit TF akan dihapus (clear) sehingga prosedur layanan interrupt dieksekusi dengan kecepatan penuh. (Detail lebih lanjut tentang interrupt ini dijelaskan kemudian pada bagian bab ini.)
- TYPE 2 – Non-maskable interrupt (NMI)Terjadi ketika logika 1 diberikan pada pin input NMI mikroprosesor. Interrupt ini bersifat non-maskable, artinya tidak bisa dinonaktifkan.
- TYPE 3 – Breakpoint (INT 3)Merupakan instruksi khusus satu byte (INT 3) yang menggunakan vektor ini untuk mengakses prosedur layanan interrupt. Instruksi INT 3 sering digunakan untuk menyimpan breakpoint dalam sebuah program saat debugging.
- TYPE 4 – OverflowMerupakan vektor khusus yang digunakan bersama instruksi INTO. Instruksi INTO akan menginterupsi program jika terjadi kondisi overflow, sebagaimana tercermin pada overflow flag (OF).
- TYPE 5 – BOUNDInstruksi BOUND membandingkan isi sebuah register dengan batas yang disimpan di memori.
- Jika
isi register ≥ kata pertama di memori dan ≤ kata kedua,
maka tidak terjadi interrupt karena nilai register berada dalam batas.
- Jika
isi register di luar batas, maka interrupt tipe 5 akan terjadi.
- TYPE 6 – Invalid opcodeTerjadi ketika prosesor menemukan opcode yang tidak didefinisikan dalam program.
- TYPE 7 – Coprocessor not availableTerjadi bila koprosesor tidak ditemukan di dalam sistem, sesuai dengan bit kendali koprosesor pada Machine Status Word (MSW/CR0). Jika instruksi ESC atau WAIT dijalankan tetapi koprosesor tidak ada, maka akan terjadi exception/interrupt tipe 7.
- TYPE 8 – Double faultAktif ketika terjadi dua interrupt terpisah pada saat instruksi yang sama sedang dieksekusi.
- TYPE 9 – Coprocessor segment overrunTerjadi jika operand memori pada instruksi ESC (opcode koprosesor) melampaui alamat offset FFFFH pada real mode.
- TYPE 10 – Invalid task state segment (TSS)Terjadi dalam protected mode jika TSS tidak valid karena field limit segmen bukan 002BH atau lebih besar. Umumnya disebabkan karena TSS belum diinisialisasi.
- TYPE 11 – Segment not presentTerjadi ketika bit P = 0 (present bit) dalam sebuah deskriptor menunjukkan bahwa segmen tidak ada atau tidak valid dalam protected mode.
- TYPE 12 – Stack segment overrunTerjadi jika segmen stack tidak ada (P = 0) dalam protected mode, atau bila batas stack segment terlampaui.
- TYPE 13 – General protection faultTerjadi pada sebagian besar pelanggaran proteksi dalam sistem protected mode 80286 hingga Core2. (Dalam Windows, error ini muncul sebagai General Protection Fault).Contoh pelanggaran:a. Batas tabel deskriptor terlampauib. Aturan hak istimewa (privilege) dilanggarc. Jenis segmen deskriptor tidak valid dimuatd. Penulisan ke segmen kode yang dilindungie. Membaca dari segmen kode yang hanya boleh dieksekusif. Penulisan ke segmen data yang hanya boleh dibacag. Batas segmen terlampauih. CPL = IOPL ketika mengeksekusi instruksi CTS, HLT, LGDT, LIDT, LLDT, LMSW, atau LTRi. CPL > IOPL ketika mengeksekusi instruksi CLI, IN, INS, LOCK, OUT, OUTS, dan STI
- TYPE 14 – Page faultTerjadi pada setiap kesalahan akses memori atau kode akibat page fault dalam mikroprosesor 80386, 80486, dan Pentium–Core2.
- TYPE 16 – Coprocessor errorTerjadi ketika ada error pada koprosesor (ERROR = 0) akibat instruksi ESCape atau WAIT pada mikroprosesor 80386, 80486, dan Pentium–Core2.
- TYPE 17 – Alignment checkMenunjukkan bahwa data word atau doubleword diakses pada alamat memori ganjil (atau alamat yang salah dalam kasus doubleword). Interrupt ini aktif pada mikroprosesor 80486 dan Pentium–Core2.
- TYPE 18 – Machine checkMengaktifkan interrupt manajemen memori sistem pada mikroprosesor Pentium–Core2.
Sebuah interrupt vector menyimpan alamat lengkap dari
Interrupt Service Routine (ISR), yaitu lokasi program yang akan
dijalankan prosesor ketika interrupt terjadi.
- Offset
(low) [Byte 0]
Bagian rendah dari alamat offset (Instruction Pointer / IP). - Offset
(high) [Byte 1]
Bagian tinggi dari alamat offset.
→ Jadi offset = IP (16-bit) yang menunjukkan alamat relatif instruksi pertama ISR di dalam segmen kode. - Segment
(low) [Byte 2]
Bagian rendah dari alamat segmen (Code Segment / CS). - Segment
(high) [Byte 3]
Bagian tinggi dari alamat segmen.
→ Jadi segment = CS (16-bit) yang menunjukkan segmen tempat ISR berada.
Interrupt Instructions: BOUND, INTO, INT, INT 3, and IRET
BOUND
-
Digunakan untuk memeriksa apakah suatu indeks berada dalam rentang (bounds) yang ditentukan.
-
Jika nilai indeks berada di luar batas, prosesor akan menghasilkan interrupt tipe 5 (BOUND range exceeded).
-
Biasanya dipakai dalam operasi array atau validasi data.
-
-
INTO (Interrupt on Overflow)
-
Menghasilkan interrupt jika flag overflow (OF) dalam register flag bernilai 1.
-
Biasanya digunakan setelah operasi aritmatika untuk mendeteksi apakah terjadi overflow.
-
Jika OF = 0, instruksi ini diabaikan (tidak terjadi interrupt).
-
-
INT
-
Instruksi untuk memanggil interrupt software dengan nomor interrupt tertentu (n = 0–255).
-
Prosesor akan mencari alamat ISR (Interrupt Service Routine) dari interrupt vector table, lalu menjalankan ISR tersebut.
-
Contoh:
INT 21H
sering digunakan pada DOS untuk layanan sistem.
-
-
INT 3
-
Instruksi khusus untuk debugging.
-
Secara otomatis memicu interrupt tipe 3 (breakpoint interrupt).
-
Digunakan oleh debugger untuk menghentikan eksekusi program di titik tertentu.
-
-
IRET (atau IRETD pada 80386 ke atas)
-
Digunakan untuk kembali dari interrupt.
-
Instruksi ini akan memulihkan nilai IP (Instruction Pointer), CS (Code Segment), dan flag register dari stack, sehingga program dapat melanjutkan eksekusi tepat setelah titik yang terinterupsi.
-
FIGURE 12–3 The protected mode interrupt descriptor.
Figure 12-3 menunjukkan interrupt descriptor dalam mode protected pada arsitektur mikroprosesor Intel. Descriptor ini digunakan untuk menentukan alamat prosedur layanan interupsi (Interrupt Service Routine/ISR) ketika sebuah interupsi terjadi. Bagian paling bawah berisi offset rendah (A15–A0), yang menyimpan 16 bit alamat awal ISR. Di atasnya terdapat segment selector, yang menunjukkan segmen kode tempat ISR berada. Bagian berikutnya berisi bit-bit kendali, yaitu P (Present bit) yang menandakan apakah descriptor valid, DPL (Descriptor Privilege Level) yang menentukan tingkat hak akses interupsi, serta sebuah field tipe yang berisi kode tetap (01110) dan nilai heksadesimal (00H) untuk mengidentifikasi jenis gate (interrupt gate/trap gate). Pada bagian paling atas terdapat offset tinggi (A31–A16), yang melengkapi alamat ISR hingga 32 bit penuh. Dengan struktur ini, sistem dalam mode protected dapat mengakses rutin interupsi secara aman, terstruktur, dan sesuai dengan level hak akses yang ditentukan.
FIGURE 12–4 The flag
register. (Courtesy of Intel
Corporation.)
Figure 12-4 menunjukkan flag register pada mikroprosesor Intel, yang digunakan untuk menyimpan informasi status hasil operasi aritmatika maupun kontrol prosesor. Beberapa bit penting ditampilkan, antara lain C (Carry flag) di bit 0 yang menandakan adanya carry atau borrow pada operasi biner, P (Parity flag) di bit 2 yang menunjukkan paritas hasil, A (Auxiliary carry) di bit 4 untuk operasi BCD, Z (Zero flag) di bit 6 yang menandakan hasil bernilai nol, S (Sign flag) di bit 7 yang menunjukkan tanda hasil (positif/negatif), T (Trap flag) di bit 8 untuk mode debug satu langkah, I (Interrupt enable flag) di bit 9 yang mengontrol apakah interupsi maskable diizinkan, D (Direction flag) di bit 10 untuk operasi string (menentukan auto-increment atau auto-decrement), dan O (Overflow flag) di bit 11 yang menandakan overflow pada operasi signed. Register ini sangat penting karena memengaruhi alur eksekusi instruksi berikutnya, misalnya dalam instruksi percabangan bersyarat atau pengendalian interupsi.
Example 12-1
Example 12–1 menunjukkan sebuah prosedur layanan interupsi yang mengaktifkan proses tracing dengan cara mengatur bit trap flag pada stack dari dalam prosedur.
Figure 12-8 memperlihatkan diagram timing antara sinyal INTR (Interrupt Request) dan INTA (Interrupt Acknowledge) pada sistem mikroprosesor. Ketika perangkat eksternal meminta interupsi, sinyal INTR dinaikkan. Mikroprosesor kemudian merespons dengan mengeluarkan sinyal INTA (acknowledge) dalam dua siklus berturut-turut. Selama siklus acknowledge pertama, bus data D7–D0 biasanya diabaikan (ditandai dengan simbol *), sedangkan pada siklus acknowledge kedua, perangkat interrupt controller meletakkan nomor vektor interupsi pada bus data, yang akan digunakan oleh prosesor untuk memanggil service routine yang sesuai. Sinyal LOCK digunakan untuk mengunci bus selama proses acknowledge agar tidak terjadi konflik akses. Dengan demikian, diagram ini menunjukkan urutan waktu bagaimana prosesor mengenali, mengakui, dan menangani permintaan interupsi melalui mekanisme vektor interupsi.
Komentar
Posting Komentar