Quelles sont les conventions d'appel pour les appels UNIX et Linux sur i386 et x86-64

les liens suivants expliquent les conventions d'appel système x86-32 pour UNIX (BSD flavor) et Linux:

  • http://www.int80h.org/bsdasm/#system-calls

  • http://www.freebsd.org/doc/en/books/developers-handbook/x86-system-calls.html

mais quelles sont les conventions d'appel système x86-64 sur les deux UNIX Et Linux?

110
demandé sur Peter Cordes 2010-03-29 09:48:43

4 réponses

je les ai vérifiés en utilisant GNU Assembler (gas) sous Linux.

Noyau "D'Interface 1519210920"

x86-32 Appel Système Linux convention:

dans x86-32 les paramètres pour les appels système Linux sont passés en utilisant des registres. %eax pour syscall_number. %ebx, %ecx, %edx, %esi, %edi, %ebp sont utilisés pour passer 6 paramètres aux appels système.

La valeur de retour est dans %eax . Tous les autres registres (y compris les EFLAGS) sont conservés sur le int "151920920"x80 .

j'ai pris l'extrait suivant du tutoriel Linux Assembly Tutorial mais j'en doute. Si quelqu'un peut montrer un exemple, ce serait formidable.

S'il y a plus de six arguments, %ebx doit contenir la mémoire lieu où la liste des arguments est stocké - mais ne vous inquiétez pas à ce sujet parce que c'est peu probable que vous utiliserez un syscall avec plus de six argument.

pour un exemple et un peu plus de lecture, se référer à http://www.int80h.org/bsdasm/#alternate-calling-convention

il y a un moyen plus rapide de faire des appels système 32bit: en utilisant sysenter . Le noyau mappe une page de mémoire dans chaque processus( le vdso), avec le côté de l'espace utilisateur du sysenter , qui DOIT coopérer avec le noyau pour qu'il puisse trouver l'adresse de retour. arg pour enregistrer de la cartographie est la même que pour int "151920920"x80 , mais au lieu de cette instruction, le code doit appeler une fonction dans le vdso. (TODO: mettre à jour avec un lien et/ou spécifiques info).

x86-32 [Free|Open|Net|DragonFly]BSD system Call convention:

Les paramètres

sont transmis sur la pile. Poussez les paramètres (dernier paramètre poussé en premier) sur la pile. Ensuite, appuyez sur un 32-bit supplémentaire de données factices (ce n'est pas en fait des données factices. reportez-vous au lien suivant pour plus d'informations) et ensuite donner une instruction d'appel de système int "151920920"x80

http://www.int80h.org/bsdasm/#default-calling-convention


x86-64 Linux de l'Appel Système de la convention:

x86-64 Mac OS X est similaire mais différent . TODO: vérifiez ce que fait * BSD.

se Référer à la section: "A. 2 AMD64 Linux Noyau Conventions" de System V Interface Binaire pour l'Architecture AMD64 Processeur Supplément . Les dernières versions des psABIs système V i386 et x86-64 se trouvent lié à partir de cette page dans le rapport du responsable de L'ABI . (Voir aussi le wiki étiquette pour mise à jour ABI liens et beaucoup d'autres bonnes choses sur x86 asm.)

Voici l'extrait de cette section:

  1. applications au niveau de L'utilisateur utilisation comme registres entiers pour passer le séquence de %de l'aqr, %rsi, %rdx, %rcx, %r8 et %r9. l'interface du noyau utilise %rdi, %rsi, %rdx, %r10, %r8 et %r9.
  2. un appel système se fait via l'instruction syscall . Ce trèfle % rcx et %r11, ainsi que %rax, mais d'autres registres sont préservés.
  3. le numéro du syscall doit être passé dans le registre %rax.
  4. les appels système sont limités à six arguments, aucun argument n'est passé directement sur la pile.
  5. revenant du syscall, register %rax contient le résultat de l'appel-système. Une valeur entre -4095 et -1 indique une erreur, c'est -errno .
  6. seules les valeurs de classe entier ou de classe mémoire sont passées au noyau.

rappelez-vous que ceci provient de L'annexe spécifique à Linux de L'ABI, et même pour Linux c'est informatif et non normatif. (Mais en fait, c'est exact.)

Interface Utilisateur

x86-32 Convention D'appel de fonction:

En x86-32 les paramètres ont été transmis sur la pile. Le dernier paramètre a été poussé d'abord sur la pile jusqu'à ce que tous les paramètres soient terminés, puis l'instruction call a été exécutée. Ceci est utilisé pour appeler des fonctions de bibliothèque C (libc) sur Linux depuis assembly.


x86-64 Convention D'appel de fonction:

x86-64 passe args dans les registres, ce qui est plus efficace que la Convention stack args de i386 System v. Il évite la latence et les instructions supplémentaires pour stocker les args en mémoire (cache) et les charger à nouveau dans la callee. Cela fonctionne bien parce qu'il y a plus de registres disponibles, et c'est mieux pour les CPU modernes à haute performance où la latence et l'exécution hors-de-l'ordre importe. (L'ABI i386 est très ancienne).

dans ce nouveau mécanisme: D'abord les paramètres sont divisés en classes. La classe de chaque paramètre détermine la manière dont il est passé à la fonction appelée.

Pour compléter les informations, reportez-vous à : "3.2 la Fonction de Séquence d'Appel" de System V Interface Binaire pour l'Architecture AMD64 Processeur Supplément qui se lit en partie comme suit:

une fois les arguments classés, les registres sont attribués (en de gauche à droite) pour passer comme suit:

  1. si la classe est Mémoire, passer le l'argument sur la pile.
  2. si la classe est entière, le prochain registre disponible du séquence de %de l'aqr, %rsi, %rdx, %rcx, %r8 et %r9 est utilisé

Donc %rdi, %rsi, %rdx, %rcx, %r8 and %r9 sont les registres dans l'ordre utilisé pour transmettre entier/pointeur (c'est à dire classe INTEGER) paramètres à tout libc fonction de l'assemblage. %rdi est utilisé pour le premier paramètre entier. %rsi pour le 2e, % rdx pour le 3e et ainsi de suite. Puis L'instruction call doit être donnée. La pile ( %rsp ) doit être alignée sur 16B lorsque call s'exécute.

S'il y a plus de 6 paramètres entiers, le 7ème paramètre entier et plus tard sont passés sur la pile. (Appel pop, identique à x86-32.)

les 8 premiers args à virgule flottante sont passés en %xmm0-7, plus tard sur la pile. Il n'existe pas de registres de vecteurs conservés. (Une fonction avec un mélange de FP et d'arguments entiers peut ont plus de 8 arguments de Registre au total.)

Variadic fonctions ( comme printf ) toujours besoin de %al = le nombre de FP registre args.

il y a des règles pour quand empaqueter des structures dans des registres ( rdx:rax sur le retour) vs. dans la mémoire. Voir L'ABI pour plus de détails, et vérifier la sortie du compilateur pour s'assurer que votre code est en accord avec les compilateurs sur la façon dont quelque chose doit être passé/retourné.

181
répondu claws 2017-12-15 18:37:13

vous cherchez peut-être le x86_64 ABI?

si ce n'est pas exactement ce que vous recherchez, utilisez 'x86_64 abi' dans votre moteur de recherche préféré pour trouver d'autres références.

11
répondu Jonathan Leffler 2010-03-29 05:56:21
Les conventions D'appel

définissent la façon dont les paramètres sont passés dans les registres lors de l'appel ou de l'appel par un autre programme. Et la meilleure source de ces conventions est sous la forme de normes ABI définies pour chacun de ces matériels. Pour faciliter la compilation, le même ABI est également utilisé par le programme userspace et kernel. Linux / Freebsd suivent le même ABI pour x86-64 et un autre ensemble pour 32 bits. Mais x86-64 ABI pour Windows est différent de Linux/FreeBSD. Et généralement ABI ne distinguer les appels système des "appels de fonctions" normaux. Ie, voici un exemple particulier de conventions d'appel x86_64 et C'est la même chose pour L'espace utilisateur Linux et le noyau: http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64 / (noter la séquence a,b,c,D,e, f des paramètres):

A good rendering of calling conventions vs registers usage

La Performance

est l'une des raisons de ces ABI (par ex. via enregistre au lieu de sauvegarder dans des piles de mémoire)

pour ARM il y a divers 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

Convention ARM64:

http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055b/IHI0055B_aapcs64.pdf

Pour Linux sur PowerPC:

http://refspecs.freestandards.org/elf/elfspec_ppc.pdf

http://www.0x04.net/doc/elf/psABI-ppc64.pdf

et pour embarqué il y a le EABI PPC:

http://www.freescale.com/files/32bit/doc/app_note/PPCEABI.pdf

ce document est un bon aperçu de toutes les différentes conventions:

http://www.agner.org/optimize/calling_conventions.pdf

9
répondu Peter Teoh 2016-01-23 12:26:39

en plus du lien que Jonathan Leffler fournit dans sa réponse, aussi Agner Fog Calling Conventions pdf peut être utile pour vous.

4
répondu PhiS 2010-03-29 08:08:01