2017-12-23 21 views

Antwort

3

Die beyondlogic.com Tabelle zeigt die Standard mapping, wie durch das BIOS eingerichtet, von einem IRQ (das externen Interrupt-Signal in die Interrupt Controller Programmierbarer gehen (PIC)) an die Unterbrechung oder Ausnahme-Nummer wie von der CPU gesehen. In diesem Fall ist also die Interrupt-Leitung von dem seriellen Port mit dem PIC-Eingang 3 verbunden, der, wenn er aktiviert ist, die CPU veranlaßt, den Interrupt/Exception-Handler, auf den der Eintrag 0xC in der Interrupt-Vektortabelle zeigt, auszuführen.

Dasselbe passiert mit Ausnahmen, die intern von der CPU generiert werden. Um mit Ihrem Beispiel fortzufahren, führt ein Stack-Fehler dazu, dass der Exception-Handler, auf den der Eintrag 0xC in der In-Interrupt-Vektortabelle zeigt, ausgeführt wird.

In diesem Fall ist es also nicht so, dass der Interrupt der seriellen Schnittstelle einen Stapelfehler verursacht, sondern dass zwei verschiedene Ereignisse bewirken können, dass derselbe Interrupt/Exception-Handler ausgeführt wird.

Dieser Konflikt ist nicht wünschenswert. Theoretisch könnte der Interrupt-/Exception-Handler-Code prüfen, um zu sehen, was tatsächlich den Handler verursacht hat, aber das würde Zeit brauchen, also brauchen wir eine bessere Lösung.

Aber zuerst lohnt es sich zu sehen, was diesen Zusammenstoß in erster Linie verursacht hat. Intel hat immer Einträge von weniger als 0x20 für interne Ausnahmen reserviert, aber auf dem 8086 wurden nur die Einträge 0 bis 4 verwendet. Wenn also der ursprüngliche IBM PC Interrupts von 8 und höher zugeordnet wurde, war das kein Problem.

Mit der Einführung des 80386 und des geschützten Modus wurde die Anzahl der Ausnahmen erhöht, und die Einträge 5 bis 0x14 wurden jetzt verwendet, was zu Konflikten mit Interrupts führen konnte, wenn das Standard-IRQ-Mapping verwendet wurde.

Die Lösung, die von den meisten modernen Betriebssystemen verwendet wird, die im geschützten Modus ausgeführt werden, besteht darin, den PIC neu zu programmieren, so dass Interrupts Interrupt-Vektornummern 0x20 oder größer verwenden. Siehe OSDev.org für weitere Details oder für ein konkretes Beispiel siehe Linux tut dies.

+0

Vielen Dank, sehr hilfreich! –

Verwandte Themen