Memahami Interrupt Di Komputer


Salah satu karakteristik komputer (PC) yang sering kali ditunjukkan adalah ia selalu mengerjakan perintah berurut, langkah demi langkah.   Yup, begitulah cara kerja prosesor (CPU) di komputer!   Akan tetapi tidak selamanya alur eksekusi selalu berurutan.   Prosesor dapat saja menerima sebuah sinyal penting dimana ia harus segera menanganinya dan menunda terlebih dahulu apa yang sedang dikerjakannya saat ini.   Sinyal penting tersebut disebut sebagai interrupt.   Prosesor dapat menerima dua jenis interrupt, yaitu hardware interrupt dan software interrupt.   Sesuai namanya, hardware interrupt adalah interrupt yang dikirim oleh hardware melalui jalur khusus.   Contoh hardware interrupt adalah sinyal yang dikirim ke prosesor saat tombol keyboard ditekan.   Interrupt ini bersifat asynchronous karena sinyal tersebut dapat dikirim kapan saja saat prosesor sedang mengerjakan program.   Kebalikannya, software interrupt adalah interrupt yang dikirim oleh software (dengan kata lain sinyal yang dikirim dari dalam prosesor itu sendiri).

Mengapa memakai interrupt?   Untuk menunjukkan alasan penggunaan interrupt, saya akan menggunakan contoh proses untuk membaca apa yang diketik dari keyboard.   Tanpa interrupt, program harus memerintahkan prosesor untuk secara periodik memeriksa apakah ada tombol yang di tekan di keyboard.   Teknik ini disebut sebagai polling.   Semakin banyak hardware yang terlibat dalam proses polling, maka beban prosesor akan semakin berat.   Ingat bahwa polling harus memeriksa secara periodik walaupun tidak ada tombol yang di tekan di keyboard.   Interrupt menawarkan solusi yang lebih baik: prosesor akan mendapatkan notifikasi hanya bila tombol keyboard ditekan.

Pada contoh di atas, muncul sebuah pertanyaan: bukankah ada banyak hardware dalam sebuah PC, berapa banyak jalur yang khusus dipakai untuk mengirim interrupt?   CPU untuk PC umumnya hanya memiliki satu pin INTR (dan satu lagi untuk Non Maskable Interrupt/NMI) .   Anggap saja semua hardware dapat dihubungkan ke pin tersebut secara langsung, pertanyaannya adalah bila semua hardware mengirim sinyal secara bersamaan ke pin INTR, mana yang harus ditangani oleh prosesor terlebih dahulu?   Untuk mengatasi permasalahan ini, arsitektur hardware PC memakai teknik multiplexing dengan memperkenalkan PIC (Programmable Interrupt Controller).   Hardware terhubung ke PIC yang kemudian terhubung ke CPU.   PIC akan membuat antrian dan menentukan interrupt mana yang akan diteruskan ke prosesor terlebih dahulu.   Pada komputer modern, PIC sudah digantikan oleh APIC (Advanced Programmable Interrupt Controller).   APIC mendukung hingga 255 jalur interrupt dan mendukung multiprocessor.   APIC terdiri atas 2 komponen, yaitu I/O APIC yang terhubung ke jalur interrupt di perangkat keras dan Local APIC yang terletak di masing-masing prosesor.

Pertanyannya berikutnya, yang lebih ke arah software (eksekusi), adalah bagaimana prosesor bisa tahu apa yang harus dikerjakan saat sebuah interrupt terjadi?   Sebagai perbandingan, prosesor (CPU) akan selalu mengerjakan perintah yang ada di lokasi ECS:EIP.   Setelah perintah selesai dikerjakan, nilai EIP akan bertambah.   Ini yang menyebabkan CPU selalu mengerjakan perintah secara berurut, walaupun beberapa instruksi seperti JMP dan CALL dapat mengubah nilai register ECS dan EIP ke lokasi yang tidak berurut lagi.   Lalu, bila interrupt terjadi, CPU harus mengerjakan apa?

Untuk menjawab pertanyaan di atas, saya perlu memahami apa yang disebut sebagai vector number.   Setiap interrupt memiliki vector number dengan nilai dari 0 hingga 255 (dimana nilai 0 hingga 31 tidak boleh dipakai!).   Jadi, hardware boleh memiliki vector number dari 32 hingga 255.   Setiap kali terjadi interrupt, prosesor akan meminta vector number dari interrupt bersangkutan (kecuali non-maskable interrupt yang selalu memiliki vector number 2).

Interrupt Dispatch Table (IDT) adalah sebuah struktur data array yang berisi lokasi instruksi yang akan dikerjakan bila terjadi interrupt.   Prosesor akan menentukan instruksi yang akan dikerjakan dengan memanggil alamat di IDT (anggap saja pemanggilan ini sama seperti pada instruksi CALL) berdasarkan vector number untuk interrupt tersebut.

Yang bertugas untuk mengisi nilai IDT, yang menentukan apa yang harus dilakukan bila ada interrupt, adalah sistem operasi. Sebagai contoh, di Windows Debugger, saya dapat melihat isi IDT dengan menggunakan perintah !idt, seperti pada berikut ini:

0: kd> !idt

Dumping IDT:

37:     83640104 hal!PicSpuriousService37
71:     87610cd8 i8042prt!I8042MouseInterruptService (KINTERRUPT 87610c80)
72:     86b1ea58 USBPORT!USBPORT_InterruptService (KINTERRUPT 86b1ea00)
80:     87610a58 dxgkrnl!DpiFdoMessageInterruptRoutine (KINTERRUPT 87610a00)
81:     8727b058 i8042prt!I8042KeyboardInterruptService (KINTERRUPT 8727b000)
82:     86b1ecd8 USBPORT!USBPORT_InterruptService (KINTERRUPT 86b1ec80)
...

Pada output di atas, terlihat bahwa bila terjadi interrupt pada vector number 0x81 (bilangan heksadesimal bukan desimal), maka kode program di driver keyboard (i8042prt.sys) akan dikerjakan.   Jadi, mekanisme yang disediakan oleh hardware (prosesor) hanya sebatas sampai memanggil kode program berdasarkan IDT.   Sistem operasi-lah yang bertanggung jawab untuk mengisi IDT.  Selain itu, khusus untuk sistem operasi Windows, ia tidak memakai fasilitas prioritas dari APIC melainkan menggunakan manajemen berbasis software yang disebutnya sebagai IRQL.  Alasan utama Windows melakukan hal ini adalah agar tidak terikat pada fasilitas hardware (PIC, APIC, atau lainnya nanti) sehingga lebih portable.  Dampak buruknya: Windows tidak dapat dipakai sebagai real-time operating system yang harus memiliki prioritas serba akurat.

Perihal Solid Snake
I'm nothing...

2 Responses to Memahami Interrupt Di Komputer

  1. Ping-balik: System Call Di Windows | The Solid Snake

  2. ri ti mengatakan:

    good job pak,
    mau tanya : – klo idt direlokasi gimana get alamat offsetnya ?
    – trus beda size idt x86 ama x64

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: