Generieren Systemaufrufe in x86_64 Linux immer noch Interrupts?

418
arrwags

In älteren Versionen der Linux-Architektur generierten Systemaufrufe während ihrer Ausführung immer einen Interrupt. Sie werden ausgeführt, indem die Systemrufnummer in% eax und die Parameter in% ebx,% ecx usw. festgelegt werden. Anschließend wird der spezifische Interrupt int 0x80 ausgegeben. Man könnte also sagen, dass Systemaufrufe eine häufige Ursache für Software-Interrupts auf einem System sind.

Bei modernen Architekturen von x86_64 gibt es jedoch eine spezielle Systemaufrufanweisung "syscall", die die Verwendung des Interrupts 0x80 und damit der Interruptdeskriptortabelle überhaupt umgeht. Obwohl ich glaube, dass die bisherige Methode zum Generieren eines Interrupts für Syscall noch unterstützt wird, scheint der Syscall-Befehl so zu sein, wie er in der Praxis ausgeführt wird.

Meine Frage lautet also: Ist es nicht mehr richtig zu sagen, dass Systemaufrufe Interrupts erzeugen? Würde ein Systemaufruf immer noch die Anzahl erhöhen, die in der Ausgabe der Spalte "Interrupts" von vmstat angezeigt wird?

0
Fragen Sie, ob die aktuelle Generation der x86-Architektur Interrupts generiert? Die Antwort ist natürlich, dass Interruptsignale noch generiert werden können. "Ist es nicht mehr richtig zu sagen, dass Systemaufrufe Interrupts erzeugen?" - Das wäre falsch. Ramhound vor 7 Jahren 0
Sie müssen sich die Quelle von `syscall ()` ansehen, um festzustellen, ob es sich bei den Interrupt-Aufrufen um einen Wrapper handelt. AFH vor 7 Jahren 1
@Ramhound Nein, ich frage speziell, ob Systemaufrufe speziell Interrupts generieren, nicht ob Interrupts in der aktuellen Generation der x86-Architektur überhaupt generiert werden. arrwags vor 7 Jahren 0
@AFH, so wie ich es verstehe, gibt es eine neue Anweisung, die speziell für Syscall auf Assembly-Ebene hinzugefügt wurde und nicht die generische "int" -Ordnungsanweisung zum Erzeugen von Interrupts verwendet. Ich gebe zu, ich bin nicht ganz sicher, wie man tief genug graben kann, um zu bestimmen, ob die "syscall" -Montageanweisung selbst ein Wrapper ist. arrwags vor 7 Jahren 0
@arrwags - Warum denken Sie, dass Systemaufrufe keine Interrupts generieren? Stellen Sie spezifische Dokumentation bereit, die Sie dazu bringt, dies zu denken Ramhound vor 7 Jahren 0
@Ramhound Siehe hier (http://www.felixcloutier.com/x86/SYSCALL.html) für den `syscall`-Opcode, der sich vom Software-Interrupt` int`-Opcode unterscheidet. In diesem Sinne "erzeugen Systemaufrufe keine Interrupts auf x86_64": Sie verwenden einen anderen (schnelleren) Weg, um in den Kernelmodus zu wechseln. Ich habe keine Ahnung, ob es in `vmstat` zählt, und der Ausdruck" Interrupts erzeugt "ist IMHO in erster Linie schlecht. dirkt vor 7 Jahren 0
@dirkt - Danke, dass Sie diesen Link zur Verfügung gestellt haben. Ich bin neugierig, ob Sie mit dem Satz "Interrupts erzeugen" Ihren Widerspruch erweitern könnten. Wäre es nicht richtig zu sagen, dass zuvor ein Interrupt für einen Systemaufruf generiert wurde? Wie Sie bereits erwähnt haben, würden sie zuvor den Opcode "int" für einen Software-Interrupt erzeugen, um einen Systemaufruf zu tätigen. Ich hatte also das Gefühl, dass ein Systemaufruf sagen könnte, der zuvor "einen Interrupt erzeugt" hatte. arrwags vor 7 Jahren 0
Normalerweise erzeugt * Hardware * Interrupts. Eine int-Anweisung ist ein * Software-Interrupt. Es wird nicht generiert, sondern ausgeführt. "Ein Systemaufruf führt einen Software-Interrupt aus, um in den Kernel-Kontext zu wechseln", kann also nicht missverstanden werden. Ich war mir beim Lesen zum ersten Mal nicht sicher, ob es sich um Hardware-Interrupts handelte, die während der Zeit generiert wurden, zu der die CPU den Systemaufruf ausführt, oder vielleicht sogar etwas anderes. dirkt vor 7 Jahren 0

0 Antworten auf die Frage