Interupsi BIOS vs interupsi perangkat keras

Oct 12 2020

Pada chip x86 yang berjalan dalam Real Mode, interupsi diselesaikan dengan bantuan IVT (Interrupt Vector Table), yaitu array yang terletak di alamat 0000h: 0000h yang terdiri dari 256 entri, alamat 32-bit (segmen + offset) yang arahkan ke kode penangan interupsi.

Halaman ini (bersama dengan banyak halaman lainnya) mencantumkan bahwa penangan interupsi yang dapat ditentukan pengguna pertama adalah 20 jam. 32 penangan pertama dicadangkan dan digunakan untuk berbagai tujuan. Misalnya, interupsi 10h digunakan untuk pengecualian FPU x87, sedangkan interupsi 13h digunakan untuk pengecualian SIMD FP. Namun, halaman ini (bersama dengan banyak halaman lainnya, termasuk Daftar Interupsi Ralf Brown) menunjukkan bahwa interupsi 10h dan 13h masing-masing ditentukan oleh BIOS untuk layanan video dan disk. Apakah ada sesuatu yang saya lewatkan, atau apakah alamat interupsi ini digunakan untuk interupsi perangkat keras dan perangkat lunak pada saat yang bersamaan?

Jawaban

20 Noname Oct 12 2020 at 22:29

Sementara dokumentasi untuk CPU 8088 yang digunakan pada PC IBM asli mencadangkan 32 vektor interupsi pertama untuk pengecualian CPU, 8088 hanya menggunakan beberapa di antaranya. Ketika IBM merancang PC, mereka memilih untuk mengabaikan ini dan menetapkan vektor yang dicadangkan tetapi tidak digunakan untuk tujuan mereka sendiri.

8088 asli hanya mendefinisikan pengecualian untuk 5 vektor interupsi pertama, masing-masing untuk Divide Error, Single Step, NMI, Breakpoint, dan Overflow. Vektor interupsi 5 hingga 31 ditandai sebagai dicadangkan dalam Panduan Pengguna Keluarga Intel 8086:

Meskipun demikian, IBM memutuskan agar BIOS mereka mengkonfigurasi pengontrol interupsi untuk mengirimkan interupsi perangkat keras yang dimulai dari vektor interupsi 8. Karena PC IBM asli hanya mendukung 8 interupsi perangkat keras, ini berarti bahwa vektor 8 hingga 15 digunakan untuk interupsi perangkat keras. IBM kemudian mulai menetapkan layanan BIOS yang dimulai dengan vektor 16 (10h), untuk dipanggil menggunakan interupsi perangkat lunak. Selain itu, vektor 5 digunakan untuk mengimplementasikan fungsi layar cetak. Vektor yang dicadangkan 6 dan 7 tidak digunakan.

Sayangnya ini terbukti menjadi kesalahan oleh IBM, karena ketika Intel merancang 80286 mereka mendefinisikan pengecualian CPU tambahan dalam rentang yang dicadangkan, naik hingga vektor 13 (0Dh). Ini berarti IBM PC / AT, yang menggunakan CPU 80286 tetapi juga harus kompatibel ke belakang dengan PC IBM berbasis 8088 asli, memiliki vektor interupsi dengan dua tujuan berbeda, satu ditentukan oleh CPU dan satu lagi didefinisikan oleh BIOS.

Secara khusus, memiliki layar cetak dan BOUNDpengecualian pelanggaran menggunakan vektor 5 terbukti menjadi gangguan yang cukup besar. Secara teori, ini seharusnya tidak menjadi masalah, karena program apa pun yang menggunakan BOUNDinstruksi baru perlu menginstal pengendali interupsi mereka sendiri, yang dapat membedakan antara dua sumber. Dalam praktiknya, bagaimanapun BOUNDinstruksi tersebut akhirnya dieksekusi secara tidak sengaja oleh program yang telah crash dan pengendali BIOS default kemudian akan terjebak dalam putaran pencetakan layar yang tak terbatas.

Penggunaan yang saling bertentangan lainnya untuk vektor tidak terlalu menjadi masalah, karena pengecualian 10 hingga 13 biasanya hanya akan dihasilkan dalam mode terlindungi. Sistem operasi mode terlindung tidak perlu kompatibel ke belakang dan tidak dapat menggunakan BIOS, jadi dapat mengkonfigurasi ulang pengontrol interupsi untuk mengirimkan interupsi perangkat keras melalui vektor di luar rentang yang dicadangkan.

Pengecualian CPU lainnya yang ditentukan oleh prosesor Intel yang lebih baru juga biasanya tidak dihasilkan oleh kode mode nyata yang harus kompatibel ke belakang atau ditangani oleh penangan BIOS default yang dapat membedakan dengan baik antar sumber.

8 TeaRex Oct 12 2020 at 21:03

Dalam Arsitektur PC / AT asli, sinyal pengecualian FPU yang harus dihubungkan langsung ke pin input khusus pada CPU utama dan akan muncul saat INT 10h dirutekan ulang oleh logika lem ke pengontrol IRQ kedua sehingga muncul sebagai IRQ 13 (yaitu INT 75h) sebagai gantinya. Sebagian besar vektor lain yang berkonflik bersifat sedemikian rupa sehingga vektor yang ditentukan perangkat keras hanya diminati dalam mode terlindung, dan vektor yang ditentukan BIOS hanya dalam mode nyata, sehingga biasanya tidak akan ada konflik nyata. Pada dasarnya, semuanya adalah kasus insinyur IBM yang melakukan sesuatu secara berbeda dari apa yang dimaksudkan oleh para insinyur Intel.