Frage

In der Intel Software-Entwickler Handbuch heißt es, dass Interrupt-Vektoren 32-255 sind in der Regel Benutzer für externe IO-Devices definiert. In meiner Systemprogrammierung Klasse muß ich einen einfachen Gerätetreiber entwickeln. Meine Frage ist, wie kann ich einen bestimmten Interrupt-Vektor definieren für ein bestimmtes Gerät verwendet werden? Ist das mit dem BIOS getan?

Hinweis: Wir sind ein einfaches Betriebssystem zu entwickeln, um meine Situation ganz spezifisch ist, aber am Ende muß ich verstehen, wie das alles auf einem x86-System passiert. Derzeit ist unser System so einrichten, dass einige Interrupt-Vektoren über 32 zugeordnet sind Geräte wie eine serielle Schnittstelle und Tastatur. Beim Lesen des Datenblatt für den Intel 82801EB ICH5 IO-Controller, speziell den Abschnitt über die PICs 8259, heißt es, dass IRQ15 die sekundären IDE-Kanal ist. Wie würde das schließlich auf dem Stapel als Interrupt-Vektor gesetzt werden?

Ich kann nur so verwirrt sein, dass diese Frage keinen Sinn, so entschuldige ich mich im Voraus.

EDIT: Also unsere Systeme Programmierung Klasse hat ein sehr einfachen OS, die für die Installation von ISR-Kernel-Routinen haben auf bestimmte Unterbrechungen aufgrund der Vektornummer zu behandeln. In unserer Klasse letzten Quartal gab der Professor uns eine Header-Datei, die die Tastatur als Vektornummer 0x2c oder etwas ähnliches definiert. Ich versuche, herauszufinden, wie die primären und / oder sekundären IDE-Kanal verschiedene ISR-Interrupts kartieren unsere Kernel-Routinen. Denn jetzt alle nicht verwendeten Interrupt-Vektoren haben eine Standardprozedur, die Nachrichten gedruckt werden würde, wenn ein Interrupt aufgetreten ist, so IDE-Interrupts sind nicht einmal auf im Moment jedoch, dass eine andere Frage.

War es hilfreich?

Lösung 5

Nun, scheine ich die Antwort in unserem Support-Code gefunden zu haben, speziell die PIC-Initialisierungsroutine. Mit den folgenden Code IRQ-Leitungen werden bei Offset 20h und 28h in dem IDT für die Master- und Slave-PICs abgebildet ist.

/* ICW2: master offset of 20 in the IDT, slave offset of 28 */

__outb( PIC_MASTER_IMR_PORT, 0x20 );
__outb( PIC_SLAVE_IMR_PORT, 0x28 );

Das bedeutet, daß die Tastatur an Vektornummer 2c und die primären und sekundären Kanäle abgebildet wurde, wird bis 2e abgebildet werden und jeweils 2f. Einige von euch wahrscheinlich mir gegeben haben könnte bessere Antworten hatte ich die Frage besser gefragt, aber ich schätze die Hilfe trotzdem!

Tabelle 45 des 82801EB ICH5 Datenblatt Details der IRQ-Leitungen des 8259, und in meinem O wird der Master einfach bei Offset 20h geladen und der Slave 28h.

Danke!

Andere Tipps

Sie können die PIC-Programm (Programmable Interrupt Controller) bestimmte Gerät IRQ abzubilden.

Auf x86 gibt es zwei PIC die IRQ0-IRQ17 geben und kaskadieren. IRQ0-7 wird durch die 8259 und IRQ8-15 8259 durch ein zweites die ersten Signale und die CPU ist der Master, mit dem zweiten (Slave) verwaltet Signalisieren des ersten.

Der IDT (Interrupt-Deskriptortabelle) ordnet das Interrupts an die Adressen von ISR (Interrupt-Service-Routinen). Interrupts kann direkt mit dem INT-Befehl (Software-Traps) erhöht werden.

Zum Beispiel zu erhöhen Interrupt 0x80, führen INT 0x80.

So behandeln 0x80, mov [0x80*4], int_80_handler. Unter der Annahme, ist eine 32-Bit-Architektur, die Adresse der Funktion int_80_handler nun am 0x80'th Stelle in dem IDT gespeichert.

Sie finden diese hilfreich:
http://en.wikipedia.org/wiki/Intel_8259
http://en.wikipedia.org/wiki/Interrupt_Handler
http://en.wikipedia.org/wiki/Interrupt
http://en.wikipedia.org/wiki/Interrupt_descriptor_table

Es ist schon eine Weile her, seit ich mit diesem Zeug beschäftigt habe so diese ausgeschaltet sein kann: Ich erinnere daran, dass der PC-Interrupt-Controller 15 IRQ-Leitungen hat. Diese Karte auf bestimmte x86 benachbarten Interrupt-Vektoren. Also, wenn ein peripheres eine IRQ-Leitung ausgelöst wird, unterbricht der PIC die CPU und erzählt, welcher Vektor zu springen, als ob der entsprechende INT-Befehl ausgeführt wurde. Einige IRQ auf bestimmte Peripheriegeräte fest einprogrammiert, aber ich glaube, dass PCI-Geräte mit dem Betriebssystem aushandeln IRQs und einigen anderen Ressourcen (wie auch die alten ISA-PnP-Geräte).

Ich verstehe nicht, was Sie unter ‚Wie die schließlich auf dem Stapel als Interrupt-Vektor gesetzt werden würde?‘

Es gibt zwei Möglichkeiten für ein Gerät einen Interrupt zu bekommen:

  1. die Plug & Play-oder PCI-Mechanismus. Wenn Sie das BIOS dies tun, werden Sie Ihre Peripheriegerät aufrufen und für die Ressourcenanforderungen stellen. Danach Ihr Fahrer kann die Plug-and-Play-Geräte aufzuzählen, für das unterstützte Gerät suchen und die Hardware-Interrupt aus dem Gerät bekommen.

  2. Wie es in den frühen Tagen geschehen ist: Nur eine Interrupt verwenden. Hinzufügen einen DIP-Schalter auf das Gerät, das der Benutzer zwischen verschiedenen Interrupts auswählen kann. Die Ressourcenzuweisung ist in der Hand des Benutzers jetzt. Der Benutzer wird auch irgendwie die Interrupt-Nummer an die Fahrer zur Ladezeit passieren.

Nun, wie die Interrupt-Haken. Das auf dem OS abhängig ist und der Modus der x86-in läuft Für einen nackten, kahlen Knochen-System können Sie die IDT (Interrupt Descriptor Table) über eine spezielle Anweisung abfragen. Sobald Sie das IDT haben, können Sie die Adresse erhalten und die Adresse der IRQ-Handler in den richtigen Steckplatz stecken. Für Real-Modus weiß ich nicht, wie es mehr getan hat.

Wenn Sie zumindest ein wenig Echtzeit-Betriebssystem oder etwas O-wie Laufen haben, ist es wahrscheinlich, dass es bereits eine Kernfunktion, die die harte Arbeit für Sie.

Wie ich mich erinnere es am Anfang des Speicherplatzes ein Vektortabelle ist, die an die Routine Punkte zu rufen, wenn eine bestimmte Unterbrechung auftritt. Ich kann hier bei einem zu niedriger Ebene schlagen werde (alter x86 Assembly Programmierer), aber an der Basis-Ebene Sie Ihren Vektor in dieser Tabelle installierte erhalten dann Ihre Routine aufgerufen wird. Ich habe keine meiner alten Referenzmaterial mit mir bekam so können Sie die tatsächlichen Anrufe nicht geben, aber ich wäre überrascht, wenn das offizielle Verfahren außerhalb des BIOS betrieben wird.

In diesen Tagen der GUIs Ich bin sicher, es gibt andere, geeignetere Methoden, mit denen Interrupt-Sharing und das alles gute Sachen.

EDIT: Ignorieren viel davon, ich habe gerade gesehen, dass Sie bei Interrupt 16 suchen und über der Außenseite der Hardware-Interrupts werden. I bewegt von dieser Ebene der Programmierung ab, bevor es in diesem Raum irgendwelche interessanten Bits von Hardware waren, so dass nur I je mit den ersten 15 IRQs behandelt (die 16. die Kaskade zwischen Steuerungen wird). Ich lasse es nur für den Fall es von Interesse für jemand anderen:)

INT 21h / AH = 25h - Set Interrupt-Vektor; Eingabe: AL = Unterbrechungsnummer. DS:. DX -> neue Interrupt-Handler

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top