Ein Gatter (Aufruf, Unterbrechung, Task oder Trap) wird verwendet, um die Ausführungskontrolle über Segmente hinweg zu übertragen. Die Überprüfung der Berechtigungsstufe erfolgt je nach Art des Ziels und der verwendeten Anweisung unterschiedlich.
Ein Call-Gate verwendet die Befehle CALL und JMP. Call Gates übertragen die Kontrolle von einem Code mit niedrigeren Privilegien auf einen Code mit höheren Privilegien. Das Gate DPL wird verwendet, um zu bestimmen, welche Privilegstufen Zugriff auf das Gate haben. Call Gates werden (oder wurden wahrscheinlich) schrittweise zugunsten des schnelleren SYSENTER/SYSEXIT-Mechanismus aufgegeben.
Task-Gates werden zur Unterstützung von Hardware-Multitasking verwendet. Ein Hardware-Taskwechsel kann freiwillig erfolgen (CALL/JMP an einen Task-Gate-Deskriptor) oder durch einen Interrupt oder einen IRET, wenn das NT-Flag gesetzt ist. Mit Interrupt- oder Trap-Gates verhält es sich genauso. Soweit ich weiß, werden Task-Gates nicht verwendet, da Kernel in der Regel zusätzliche Arbeit bei der Task-Umschaltung leisten wollen.
Interrupt- und Trap-Gates sind zusammen mit den Task-Gates als Interrupt Descriptor Table bekannt. Sie funktionieren genauso wie Call Gates, mit Ausnahme der Übertragung von Parametern von einem Privilege Stack zu einem anderen. Ein Unterschied besteht darin, dass Interrupt-Gates das IF-Bit in EFLAGS löschen, während Trap-Gates dies nicht tun. Damit sind sie ideal für die Bedienung von Hardware-Interrupts. Traps werden häufig in der hardwaregestützten Virtualisierung verwendet.
Weitere Informationen finden Sie in den Intel Architektur-Handbüchern zu den Prozessoren, die Sie interessieren.
Update
Um den Kommentar zu beantworten:
Es gibt viele Gründe, Interrupts von Traps zu unterscheiden. Einer davon ist der Unterschied im Anwendungsbereich: Interrupt-Gates verweisen auf den Kernel-Space (schließlich ist es der Kernel, der die Hardware verwaltet), während Traps im User-Space aufgerufen werden. Interrupt-Handler werden als Reaktion auf Hardware-Ereignisse aufgerufen, während Traps als Reaktion auf eine CPU-Anweisung ausgeführt werden.
Ein einfaches (aber unpraktisches) Beispiel, um besser zu verstehen, warum Interrupt- und Trap-Gates EFLAGS unterschiedlich behandeln, zeigt, was passieren würde, wenn wir einen Interrupt-Handler für Hardware-Ereignisse auf einem Uniprozessorsystem schreiben und das IF-Bit nicht löschen könnten, während wir einen Interrupt bedienen. Es wäre möglich, dass ein zweiter Interrupt eintrifft, während wir mit der Bedienung des ersten beschäftigt sind. Dann würde unser Interrupt-Handler vom Prozessor zu einem zufälligen Zeitpunkt während unserer IH-Ausführung aufgerufen werden. Dies könnte zu Datenverfälschung, Deadlocking oder anderen Problemen führen. In der Praxis ist das Deaktivieren von Unterbrechungen einer der Mechanismen, die sicherstellen, dass eine Reihe von Kernel-Anweisungen wie ein kritischer Abschnitt behandelt wird.
Das obige Beispiel geht allerdings von maskierbaren Interrupts aus. Sie würden NMIs sowieso nicht ignorieren wollen.
Auch heute ist sie weitgehend irrelevant. Heute gibt es praktisch keine Unterscheidung mehr zwischen schnelle und langsame Interrupt-Handler (suchen Sie nach "Fast and Slow Handlers"), Interrupt-Handler können verschachtelt ausgeführt werden, SMP-Prozessoren machen es zwingend erforderlich, lokale Interrupt-Deaktivierung mit Spin-Locks zu koppeln, und so weiter.
Trap-Gates werden in der Tat verwendet, um Software-Interrupts, Ausnahmen usw. zu bedienen. Eine Page Fault- oder Division durch Null-Ausnahme in Ihrem Prozessor wird wahrscheinlich durch ein Trap-Gate abgewickelt. Das einfachste Beispiel für die Verwendung von Trap-Gates zur Steuerung der Programmausführung ist der INT-3-Befehl, der zur Implementierung von Haltepunkten in Debuggern verwendet wird. Bei der Virtualisierung läuft der Hypervisor im Ring 0 und der Gast-Kernel normalerweise im Ring 1 - wo privilegierter Code mit einem allgemeinen Ausnahmefehler fehlschlagen würde. Witchel und Rosenblum entwickelten binäre Übersetzung was im Wesentlichen bedeutet, dass Anweisungen umgeschrieben werden, um ihre Auswirkungen zu simulieren. Kritische Anweisungen werden entdeckt und durch Traps ersetzt. Wenn die Traps ausgeführt werden, wird die Kontrolle an den VMM/Hypervisor übergeben, der für die Emulation der kritischen Anweisungen in Ring 0 zuständig ist.
Bei der hardwaregestützten Virtualisierung ist die Trap-and-Emulate-Technik in ihrer Verwendung etwas eingeschränkt (da sie recht teuer ist, vor allem, wenn sie dynamisch ist), aber die Praxis der binären Übersetzung ist immer noch weit verbreitet .
Für weitere Informationen empfehle ich Ihnen einen Blick auf:
- Linux Device Drivers, Third Edition (verfügbar online )
- Für die binäre Übersetzung, QEMU ist ein ausgezeichneter Anfang.
- Zum Thema Trap-and-Emulate, siehe ein Vergleich zwischen Software/Hardware-Techniken.
Ich hoffe, das hilft!