4 Stimmen

IRQ-Nummerierungskonflikt

Von: http://software.intel.com/en-us/articles/introduction-to-pc-architecture/

Die Ausnahmenummer 10h entspricht einem "Floating Point Error", aber der Software-Interrupt 10h entspricht auch den BIOS-Interrupts "Video support" (beide im Real-Modus).

Was übersehe ich?

7voto

Artelius Punkte 46771

Sie verpassen nichts.

Der 8088-Prozessor (der im ursprünglichen IBM-PC verwendet wurde) definierte nur die Ausnahmen 0, 1, 2, 3 und 4.

IBM verwendete also 0x8 bis 0xF für Hardware-Interrupt-Handler und 0x10 und höher für BIOS-Routinen. Aus irgendeinem Grund ignorierte IBM die Tatsache, dass Intel ganz klar reserviert Nummern 0x5 bis 0x1F für zukünftige Prozessorausnahmen.

Im Laufe der Zeit wurden immer mehr Ausnahmen benötigt, die Intel dann auch zugewiesen hat. In den meisten Fällen löste ältere Software diese Ausnahmen ohnehin nicht aus, während neuere Betriebssysteme (die im geschützten Modus liefen) andere Nummern zuweisen konnten, um nicht mit den Prozessorausnahmen in Konflikt zu geraten.

Es wurden zahlreiche Hacks in ältere Software eingebaut, um die Funktionen neuerer Prozessoren zu nutzen, ohne die Kompatibilität zu sehr zu beeinträchtigen. Ich bin mir zwar nicht sicher, aber ich vermute, dass neuere BIOSe vielleicht versucht haben, in ihrem INT10-Handler zu erkennen, ob INT10 durch einen Software-Interrupt oder durch den Coprozessor ausgelöst wurde.

Zu Ihrer Information, aus dem 386er Programmiererhandbuch:

Coprozessor-Fehler-Vektor zum Interrupt 16. Jedes 80386-System mit einem Koprozessor muss den Interrupt-Vektor 16 für die Koprozessor-Fehlerausnahme verwenden. Wenn ein 8086/8088-System einen anderen Vektor für den 8087-Interrupt verwendet, sollten beide Vektoren auf den Coprozessor-Fehler-Exception-Handler zeigen.

3voto

fvu Punkte 31678

OK, schauen Sie mal hier, auf der Website von Watcom . Dies ist meiner Meinung nach der wichtigste Teil, obwohl die alte Notiz über den 8087 auch interessant ist.

In Anbetracht der Marktrealität der großen Mehrheit der PC-Nutzer immer noch mit PC DOS läuft und die IBM PC Kompatibilität verlangten, war die Art und Weise, wie der IBM AT mit mathematischen Fehlern umging, war nicht geradlinig. Weil IBM ignorierte Empfehlung von Intel bei der Entwicklung PC ignorierte, geriet der 286er Math Fault oder Interrupt 16 in Konflikt mit dem BIOS-Videodienst Interrupt 10h (16 dezimal). Darüber hinaus Außerdem erwartete die bestehende Software, dass mathematische Ausnahmen über INT 2.

Anstatt die CPU und die FPU zu verbinden ERROR-Pins zu verbinden, verwendete der IBM AT Motherboard-Schaltungen, um das 287 ERROR-Signal an den kaskadierten zweiten 8259A PIC zu leiten und den IRQ 13 zur Signalisierung mathematische Fehler an die CPU zu melden. Der Standard BIOS IRQ 13 Handler (d.h. INT 75h Vektor - denken Sie daran, dass IRQ 8, der erste IRQ-Leitung des zweiten PIC, dem Interrupt-Vektor 70h entspricht) enthält Code zum Aufrufen von INT 2 aus Kompatibilität mit bestehender Software. Software auf dem AT kann also weiterhin den den NMI-Vektor einhängen und unverändert auf dem dem PC oder AT laufen.

Externe Schaltungen im IBM AT treibt den BUSY-Eingangspin des 286 aktiv wenn ein 287 sein ERROR-Signal aktiviert. Dies verhindert die Ausführung von weiteren FPU Befehle und ist erforderlich zur Vermeidung von Probleme in dem Zeitfenster nach dem 287 einen Fehler signalisiert hat und vor dem Zeitpunkt, zu dem der 286 mit der Verarbeitung der resultierenden Unterbrechung.

2voto

asveikau Punkte 37340

Der Gleitkommafehler ist ein CPU-Interrupt, der durch eine Fehlerbedingung erzeugt wird. Dies ist ein Unterschied zu einem IRQ.

Der PIC (Programmable Interrupt Controller) kann verwendet werden, um zu ändern, welche IRQs auf welchen CPU-Interrupt abgebildet werden. Wenn Sie dem IO-Port des PIC die richtige Sequenz senden (unter Verwendung des OUT Anweisung), können Sie den IRQ so zuordnen, dass er nicht mit dem CPU-Interrupt einer Gleitkomma-Ausnahme in Konflikt gerät.

Siehe auch dieses Dokument .

EDITAR: Aber jetzt, wo ich Ihre Frage noch einmal lese... Wir reden hier nicht über IRQs. BIOS Int 10h ist eine ganz andere Sache... Es handelt sich um einen Code, den Ihr BIOS für Videoroutinen implementiert hat. Wenn Sie ein Betriebssystem schreiben und sich fragen, ob Sie Fließkommafehler behandeln sollten, sollten Sie diesen speziellen BIOS-Interrupt wahrscheinlich vergessen :-)

EDIT 2: Wenn ich so drüber nachdenke, haben alte DOS-Programme wahrscheinlich den IVT-Eintrag gesichert, ihren eigenen Exception-Handler an dessen Stelle gesetzt, einige Fließkommaoperationen durchgeführt und den alten IVT-Eintrag wiederhergestellt, wenn sie mit der FPU fertig waren.

0voto

Mike Gonta Punkte 634

Die einfache Antwort ist, dass die int 10h Fließkommafehler ist eine Ausnahme im geschützten Modus, während die int 10h BIOS Video Services ist ein Real-Mode-Interrupt.

Die glückliche Antwort ist, dass das Löschen der NE Bit im CR0 Register verhindert das Auftreten der Ausnahme und ermöglicht ihre Verwendung in PM32 als einfache Unterbrechung ( zum Beispiel in einem 32-Bit-BIOS-Extender im geschützten Modus ).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X