Was sind die Aufrufkonventionen für UNIX & amp; Das Linux-System ruft i386 und x86-64 auf
Folgenden links erklären, x86-32-system-Aufruf-Konventionen für die UNIX (BSD-Geschmack) & Linux:
Aber was sind die x86-64-system Aufruf-Konventionen unter UNIX & Linux?
InformationsquelleAutor der Frage claws | 2010-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich überprüft diese mit GNU Assembler (gas) auf Linux.
Kernel-Schnittstelle
x86-32 Linux-System-Aufruf-Konvention:
In x86-32 Parameter für den Linux-Systemaufruf übergeben werden, die Verwendung von Registern.
%eax
für syscall_number. %ebx, %ecx, %edx, %esi, %edi, %ebp sind verwendet für die übergabe von 6 Parameter system fordert.Der Rückgabewert ist in
%eax
. Alle anderen Register (einschließlich EFLAGS) erhalten, über dieint $0x80
.Nahm ich folgenden Ausschnitt aus dem Linux-Tutorial Assembly aber ich bin zweifelhaft über diese. Wenn überhaupt, kann man zeigen, ein Beispiel, es wäre toll.
Für ein Beispiel und ein wenig mehr Lesen, siehe http://www.int80h.org/bsdasm/#alternate-calling-convention
Es ist schneller Weg, um 32bit-system fordert: mit
sysenter
. Die kernel-Karten eine Seite des Speichers in jedem Prozess (vdso), mit der user-space-Seite dersysenter
die Zusammenarbeit mit den kernel für die es in der Lage sein zu finden, die Rückkehr-Adresse. arg-zu-register-mapping ist das gleiche wie fürint $0x80
aber anstatt, dass der Unterricht, der code soll eine Funktion aufrufen, die in der vdso. (TODO: dieses update mit einem link und/oder spezifische Informationen).x86-32 [Free|Open|Net|Libelle]BSD-UNIX-System-Aufruf-Konvention:
Parameter auf dem Stapel übergeben werden. Schieben Sie den Parameter (den letzten parameter zuerst betätigt) auf dem stack. Dann schieben Sie eine zusätzliche 32-bit-dummy-Daten (die nicht wirklich dummy-Daten. siehe folgenden link für mehr info) und geben Sie dann einen system-Befehl call
int $0x80
http://www.int80h.org/bsdasm/#default-calling-convention
x86-64-Linux System Call convention:
x86-64-Mac OS X ist ähnlich, aber anders. TODO: überprüfen Sie, was *BSD nicht.
Siehe Abschnitt: "A. 2 AMD64 Linux Kernel Konventionen"System V Application Binary Interface AMD64 Architecture Processor Supplement. Die neuesten Versionen des i386 und x86-64-System V psABIs finden von dieser Seite aus verlinkt in der ABI-maintainer ' s repo. (Siehe auch die x86 - Tags, wiki für die up-to-date-ABI links und viele andere gute Sachen zu x86 asm.)
Hier ist der Ausschnitt aus diesem Abschnitt:
Denken Sie daran, dies ist aus der Linux-spezifischen Anhang zum ABI, und auch für Linux ist es informativ, nicht normativ. (Aber es ist in der Tat richtig.)
Benutzeroberfläche
x86-32-Funktion Aufrufkonvention:
In x86-32 Parameter übergeben wurden, auf den Stapel. Letzten parameter gedrückt wurde zuerst auf den Stapel, bis alle Parameter fertig sind und dann
call
Anweisung ausgeführt wurde. Diese dient zum aufrufen von C-Bibliothek (libc) - Funktionen auf Linux-von der Montage.x86-64 Funktion Aufrufkonvention:
x86-64 übergibt Argumente in Registern, das ist effizienter als ein i386-System V-stack args Konvention. Es vermeidet die Latenz und zusätzliche Anweisungen zu speichern args Speicher (cache) und dann laden Sie Sie wieder zurück in die aufgerufene. Dies funktioniert gut, weil es mehr Register zur Verfügung, und ist besser für moderne Hochleistungs-CPUs, in denen die Latenz-und out-of-order-Ausführung Angelegenheit. (Das i386-ABI ist sehr alt).
In diesem neue Mechanismus: Zunächst werden die Parameter in Klassen eingeteilt. Die Klasse der einzelnen parameter bestimmt die Art und Weise, in der es an die aufgerufene Funktion übergeben.
Ausführliche Informationen finden Sie unter : "3.2 Funktion Aufrufen Sequenz" von System V Application Binary Interface AMD64 Architecture Processor Supplementdie liest, teilweise:
So
%rdi, %rsi, %rdx, %rcx, %r8 and %r9
sind die Register um übergeben integer/pointer (d.h. INTEGER-Klasse) - Parameter, um alle libc-Funktion von der Montage. %rdi verwendet wird, für den ersten INTEGER-parameter. %rsi für den 2., %rdx für den 3. und so weiter. Danncall
Unterricht gegeben werden sollte. Der stack (%rsp
) muss 16B ausgerichtet, wenncall
führt.Wenn es mehr als 6 GANZZAHL-Parameter, der 7. INTEGER-parameter und später auf dem Stapel übergeben werden. (Anrufer erscheint, die gleiche wie x86-32.)
Den ersten 8 floating-point-Argumente übergeben werden, in %xmm0-7, später auf den stack. Es gibt keine call-erhaltene Vektor-Register. (Eine Funktion mit einem mix aus FP-und integer-Argumente können auch mehr als 8 insgesamt register-Argumente).
Variadischen Funktionen (wie
printf ()
) müssen immer%al
= die Anzahl der FP-register args.Gibt es Regeln, Wann ein pack structs in Registern (
rdx:rax
auf Rückkehr) vs. in memory. Siehe das ABI für details, und überprüfen Sie, compiler-Ausgaben, um sicherzustellen, dass Ihr code stimmt mit dem Compiler darüber, wie etwas sein sollte übergeben/zurückgegeben.InformationsquelleAutor der Antwort
Vielleicht sind Sie auf der Suche für die x86_64-ABI?
Wenn das nicht genau das, was Sie suchen, benutzen Sie 'x86_64 abi' in Ihre bevorzugte Suchmaschine, um herauszufinden, alternative Referenzen.
InformationsquelleAutor der Antwort Jonathan Leffler
Aufrufkonventionen definiert, wie die Parameter übergeben werden, die in den Registern, die beim aufrufen oder aufgerufen wird, die von anderen Programm. Und die beste Quelle für diese Konvention ist in form von ABI-standards definiert für jede dieser hardware. Für eine einfache Zusammenstellung, die den gleichen ABI wird auch von userspace-und kernel-Programm. Linux/Freebsd Folgen Sie den gleichen ABI für x86-64 und einen anderen für 32-bit. Aber x86-64-ABI für Windows unterscheidet sich von Linux/FreeBSD. Und in der Regel ABI nicht unterscheiden system call vs normale "Funktionen" nennt.
Dh, hier ist ein besonderes Beispiel für die x86_64-Aufrufkonventionen und es ist das gleiche für beide Linux-userspace-und kernel: http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/ (Hinweis: die Reihenfolge a,b,c,d,e,f, Parameter):
Leistung ist einer der Gründe für diese ABI (zB die übergabe von Parametern über Register anstelle von speichern in den Speicher-stacks)
Für ARM gibt es verschiedene ABI:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.swdev.abi/index.html
https://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iPhoneOSABIReference/iPhoneOSABIReference.pdf
ARM64-Konvention:
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055b/IHI0055B_aapcs64.pdf
Für Linux auf PowerPC:
http://refspecs.freestandards.org/elf/elfspec_ppc.pdf
http://www.0x04.net/doc/elf/psABI-ppc64.pdf
Und für embedded-dort ist der PPC-EABI:
http://www.freescale.com/files/32bit/doc/app_note/PPCEABI.pdf
Dieses Dokument ist guten überblick über all die verschiedenen Konventionen:
http://www.agner.org/optimize/calling_conventions.pdf
InformationsquelleAutor der Antwort Peter Teoh
Neben den link, Jonathan Leffler bietet in seiner Antwort, auch Agner Fog ist Aufrufkonventionen pdf-Datei kann nützlich sein für Sie.
InformationsquelleAutor der Antwort PhiS