Die syscall
instruction bietet eine schnellere Methode zur Eingabe von Ring-0, um einen Systemaufruf auszuführen. Dies ist eine Verbesserung gegenüber der alten Methode, die einen Software-Interrupt auslösen soll (int 0x80
unter Linux).
Ein Teil des Grundes, warum die Anweisung schneller ist, ist, weil sie den Speicher nicht ändert oder sogar rsp
ändert, um auf einen Kernel-Stack zu zeigen. Im Gegensatz zu einem Software-Interrupt, bei dem die CPU gezwungen ist, das Betriebssystem wieder in Betrieb zu setzen, ohne etwas zu überlisten, darf die CPU für diesen Befehl annehmen, dass die Software weiß, dass hier etwas passiert.
Insbesondere speichert syscall
zwei Teile des Benutzer-Space-Status in Registern. Die RIP
, zu der nach dem Anruf zurückzukehren ist, wird in rcx
gespeichert und die Flags werden in R11
(because RFLAGS is masked with a kernel-supplied value before entry to the kernel) gespeichert. Dies bedeutet, dass beide Register von der Anweisung geplagt werden.
Da sie geplottert sind, verwendet der syscall ABI ein anderes Register anstelle von rcx
, daher die Verwendung von r10
für das 4. Argument.
r10
ist eine natürliche Wahl, da in the x86-64 SystemV ABI es für das Bestehen Funktion args nicht verwendet wird, und Funktionen müssen nicht ihren Anrufer Wert von r10
zu bewahren. So kann eine Syscall-Wrapper-Funktion mov %rcx, %r10
ohne Speichern/Wiederherstellen. Dies wäre mit keinem anderen Register möglich, für 6-Arg-Syscalls und die SysV-ABI-Funktionsaufrufkonvention.
BTW, das 32-Bit-System aufrufen ABI mit sysenter
auch zugänglich ist, die Zusammenarbeit zwischen den User-Space und Kernel-Space, um nach einem sysenter
User-Space zu ermöglichen Rückkehr erfordert. (d. h. Speichern eines Zustands im Benutzerbereich vor dem Ausführen von sysenter
). Dies ist eine höhere Leistung als int 0x80
, aber peinlich. Trotzdem verwendet glibc es (indem es zu User-Space-Code auf den vdso-Seiten springt, die der Kernel in den Adressraum jedes Prozesses abbildet).
AMDs syscall
ist eine andere Herangehensweise an die gleiche Idee wie Intels sysenter
: um den Ein-/Ausstieg aus dem Kernel weniger teuer zu machen, indem man nicht unbedingt alles erhält.
In [einer anderen ABI-Antwort] (http://stackoverflow.com/a/35619528/224132) habe ich einige Links zu AMD-Mailinglisten-Posts von AMD-Architekten und Linux-Kernel-Entwicklern ausgegraben, bevor das erste AMD64-Silicon veröffentlicht wurde . Es gibt einige interessante Dinge dort, wie die experimentellen Ergebnisse (aus dem Zusammenstellen von SPECint und dem Betrachten von Code-Größe und Anzahl von Anweisungen), die zu den x86-64 SysV ABI's Auswahlmöglichkeiten führten, welches Register für welchen Zweck verwendet werden sollte. –