Erforschung der Interrupt-Verarbeitung: Externe Interrupts, Ausnahmen und Traps unter dem Intel x86-Prozessor verstehen

Die Behandlung von Interrupts bei Prozessoren gehört zu den unverzichtbaren Kenntnissen in der Computerarchitektur. Beim x86-Prozessor von Intel können Interrupts in externe Interrupts, Ausnahmen und Traps unterteilt werden. Externe Interrupts kommen von der Hardware und treten zufällig auf, während Exceptions das Ergebnis von Fehlerbedingungen sind, die während der Ausführung von Befehlen innerhalb des Prozessors erkannt werden. Traps hingegen werden vom Programm erzeugt und in der Regel durch Befehle wie INT n, INTO usw. ausgelöst.

In x86-Prozessoren behandeln Interrupt-Handler Unterbrechungen, Exception-Handler Ausnahmen und System Call Server Traps. Diese Handler können sich an beliebiger Stelle im Speicher befinden und unterschiedliche Berechtigungsstufen haben. Intel-Prozessoren verwenden Interrupt-Gates, Trap-Gates und Task-Gates, um die Eingangsadressen der Handler zu definieren. Interrupt-Gates und Trap-Gates sind die Tore zu den Exception-Handlern. Selektoren und Offsets definieren zusammen die Eingangsadresse eines Handlers. Das IF-Flag wird gelöscht, wenn ein Interrupt-Gate einen Handler betritt, während das IF-Flag unverändert bleibt, wenn ein Trap-Gate einen Handler betritt.

Der Intel-Prozessor definiert eine Interrupt-Vektornummer für jeden Interrupt und jede Ausnahme und stellt eine Korrespondenz zwischen der Interrupt-Vektornummer und dem Gatter über die Interrupt-Descriptor-Tabelle (IDT) her. Die IDT kann sich an einer beliebigen Stelle im linearen Adressraum befinden. Interrupt-Vektornummern, von denen 0 bis 31 vom Prozessor reserviert sind.

Ausnahmen im Prozessor können in Fehlerklassenausnahmen und Beendigungsklassenausnahmen unterteilt werden. Fehlerhafte Ausnahmen können korrigiert werden, während terminierte Ausnahmen schwerwiegende Fehler sind, die vom Prozessor selbst nicht behoben werden können. Aus Sicherheitsgründen kann die Kontrolle nur über Interrupt-Gates oder Trap-Gates an Codesegmente der gleichen oder einer höheren Privilegstufe übertragen werden. Normalerweise werden Handler in Kernel-Codesegmenten (Codesegmente der Privilegstufe 0) definiert.

Wenn eine Unterbrechung auftritt, drückt der Prozessor automatisch eine Reihe von Parametern auf die Spitze des Stacks, wobei EFLAGS der Systemstatus ist, bevor die Unterbrechung oder Ausnahme auftrat, SS:ESP ist die Spitze des Benutzer-Stacks, bevor die Unterbrechung oder Ausnahme auftrat, und CS:EIP ist die Rücksprungadresse der Unterbrechung oder Ausnahme. Der 64-Bit-Modus erfordert, dass der Handler in einem 64-Bit-Codesegment sein muss, und daher werden die Interrupt- und Trapdoor-Deskriptoren auf 16 Bytes erweitert, wobei die Offsets auf 64 Bits erweitert werden; die IDT stellt fest, dass nur Gate-Deskriptoren mit dem neuen Format möglich sind; die Stack-Breite wird zu 64 Bits und wenn eine Unterbrechung auftritt, wird der Stack-Zeiger (SS:RSP) bedingungslos eingedrückt; SS wird zwangsweise auf NULL gesetzt, wenn es notwendig ist, den Stack umzuschalten; ein Interrupt Stack Table (IST) Mechanismus wird hinzugefügt, der es ermöglicht, für eine bestimmte Unterbrechung oder Ausnahme einen eigenen Stack anzugeben.