syscall(2) System Calls Manual syscall(2) NOM syscall - appel systeme indirect BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include /* Definition des constantes SYS_* */ #include long syscall(long numero, ...); Exigences de macros de test de fonctionnalites pour la glibc (consulter feature_test_macros(7)) : syscall() Depuis la glibc 2.19: _DEFAULT_SOURCE Avant la glibc 2.19: _BSD_SOURCE || _SVID_SOURCE DESCRIPTION syscall() est une petite fonction de bibliotheque qui invoque l'appel systeme dont l'interface en assembleur a le numero indique avec les arguments donnes. L'utilisation de syscall() est pratique, par exemple, pour invoquer un appel systeme qui n'a pas de fonction d'enveloppe dans la bibliotheque C. syscall() sauve les registres du processeur avant de faire l'appel systeme, restaure les registres au retour de l'appel systeme et stocke tous les codes d'erreur renvoyes par l'appel systeme dans errno(3). Les constantes symboliques correspondant aux appels systeme sont dans le fichier d'en-tete . VALEUR RENVOYEE La valeur de retour est definie par l'appel systeme invoque. En general, une valeur de retour 0 indique une reussite. Une valeur de retour de -1 indique une erreur, et un code d'erreur est fourni dans errno. ERREURS ENOSYS Le numero d'appel systeme requis n'est pas implemente. D'autres erreurs sont specifiques a l'appel systeme invoque. NOTES syscall() est apparu dans 4BSD. Exigences dependantes de l'architecture L'ABI de chaque architecture possede ses propres exigences sur la facon dont les parametres des appels systeme sont passes au noyau. Pour les appels systeme qui ont une fonction d'enveloppe de la glibc (comme par exemple la plupart des appels systeme), la glibc s'occupe des details pour copier les arguments dans les bons registres d'une maniere adaptee a chaque architecture. Cependant, en utilisant syscall() pour effectuer un appel systeme, l'appelant peut avoir besoin de gerer certains details dependants de l'architecture ; cette exigence est en particulier rencontree sur certaines architectures 32 bits. Par exemple, pour l'Embedded ABI (EABI) de l'architecture ARM, une valeur 64 bits (c'est-a-dire un long long) doit etre alignee sur une paire de registres paire. Ainsi, en appelant syscall() au lieu de la fonction d'enveloppe fournie par la glibc, l'appel systeme readahead() devrait etre effectue ainsi sur l'architecture ARM avec l'EABI : syscall(SYS_readahead, fd, 0, (unsigned int) (offset & 0xFFFFFFFF), (unsigned int) (offset >> 32), count); Comme le parametre offset est 64 bits, et le premier argument (fd) est passe dans r0, l'appelant doit manuellement decouper et aligner la valeur 64 bits afin de la passer dans la paire de registres r2/r3. Cela implique de passer une valeur fantome dans r1 (le second argument, qui vaut 0). Il faut egalement veiller a ce que la division respecte les conventions endian (selon l'ABI C de la plateforme). Des problemes similaires peuvent survenir sur MIPS avec l'ABI O32, sur PowerPC avec l'ABI 32 bits, et sur Xtensa. Notez qu'alors que l'ABI parisc C utilise aussi des paires de registres alignes, il utilise une couche shim pour cacher le resultat de l'espace utilisateur. Les appels systeme concernes sont fadvise64_64(2), ftruncate64(2), posix_fadvise(2), pread64(2), pwrite64(2), readahead(2), sync_file_range(2) et truncate64(2). Cela n'affecte pas les appels systeme qui separent et assemblent manuellement les valeurs 64 bits telles que _llseek(2), preadv(2), preadv2(2), pwritev(2) et pwrite2(2). Bienvenue dans le monde fanstastique du bagage historique. Conventions d'appel par architecture Chaque architecture possede sa facon propre d'invoquer et de passer des parametres au noyau. Les details pour diverses architectures sont donnes dans les deux tableaux ci-dessous. Le premier tableau liste l'instruction utilisee pour passer en mode noyau (qui n'est pas forcement la methode la meilleure ou la plus rapide, vous devriez consulter vdso(7)), le registre (ou les registres) utilise(s) pour indiquer le numero de l'appel systeme, et le registre utilise comme code de retour de l'appel systeme, et le registre utilise pour signaler une erreur. Arch/ABI Instruction Appel Ret Ret Erreur Notes systeme n val val2 -------------------------------------------------------------------------------- alpha callsys v0 v0 a4 a3 1, 6 arc trap0 r8 r0 - - arm/OABI swi NR - r0 - - 2 arm/EABI swi 0x0 r7 r0 r1 - arm64 svc #0 w8 x0 x1 - blackfin excpt 0x0 P0 R0 - - i386 int $0x80 eax eax edx - ia64 break 0x100000 r15 r8 r9 r10 1, 6 loongarch syscall 0 a7 a0 - - m68k trap #0 d0 d0 - - microblaze brki r14,8 r12 r3 - - mips syscall v0 v0 v1 a3 1, 6 nios2 trap r2 r2 - r7 parisc ble 0x100(%sr2, %r0) r20 r28 - - powerpc sc r0 r3 - r0 1 powerpc64 sc r0 r3 - cr0.SO 1 riscv ecall a7 a0 a1 - s390 svc 0 r1 r2 r3 - 3 s390x svc 0 r1 r2 r3 - 3 superh trapa #31 r3 r0 r1 - 4, 6 sparc/32 t 0x10 g1 o0 o1 psr/csr 1, 6 sparc/64 t 0x6d g1 o0 o1 psr/csr 1, 6 tile swint1 R10 R00 - R01 1 x86-64 syscall rax rax rdx - 5 x32 syscall rax rax rdx - 5 xtensa syscall a2 a2 - - Notes : - Sur quelques architectures, un registre est utilise comme un boleen (0 indiquant aucune erreur et -1 indiquant une erreur) pour signaler que l'appel systeme a echoue. La valeur de l'erreur actuelle est toujours contenue dans le registre renvoye. Sur sparc, le bit de transport (carry bit, csr) dans le registre d'etat du processeur (psr) est utilise au lieu d'un registre entier. Sur powerpc64, le bit de debordement (overflow bit) sommaire (SO) dans le champ 0 du registre de condition (cr0) est utilise. - NR est le numero de l'appel systeme. - Pour s390 et s390x, NR (le numero de l'appel systeme) peut etre passe directement avec svc NR s'il est inferieur a 256. - Sur SuperH, des numeros de capture (<< trap >>) supplementaires sont pris en charge pour des raisons historiques mais trapa#31 est l'ABI << unifiee >> recommandee. - Les ABI x32 partagent la table syscall avec l'ABI x86-64, mais avec quelques nuances : - De maniere a indiquer qu'un appel systeme est appele sous une ABI x32, un bit additionnel, _X32_SYSCALL_BIT, est associe par un OU binaire au numero d'appel systeme. L'ABI utilise un processus qui influe sur le comportement des processus, comme le traitement des signaux ou redemarrage d'un appel systeme. - Comme x32 a des tailles differentes pour long et les types << pointeur >>, les dispositions de quelques structures (mais pas toutes ; struct timeval ou struct rlimit sont en 64 bits, par exemple) sont differentes. Pour manipuler cela des appels systeme supplementaires sont ajoutes a la table d'appel systeme, commencant au numero 512 (sans le _X32_SYSCALL BIT). Par exemple, _NR_ready est defini a 19 pour l'ABI x86-64 et comme _X32_SYSCALL_BIT | 515 pour l'ABI x32. La plupart de ces appels systeme additionnels sont actuellement identiques aux appels systeme utilises pour fournir la compatibilite i386. Cependant, il y a quelques exceptions notables, comme avec prreadv2(2), qui utilisent une entite struct iovec avec des pointeurs et des tailles (<< compat_iovec >> au niveau du noyau) en 4 bits, mais passe un argument pos 8 bits dans un seul registre et non deux comme il est fait dans toute autre ABI. - Quelques architectures (nommement : Alpha, IA-64, MIPS, SuperH, sparc/32 et sparc/64) utilisent un registre additionnel (<< Retval2 >> dans la table ci-dessus) pour renvoyer une deuxieme valeur de renvoi de l'appel systeme pipe(2) ; Alpha utilise aussi cette technique pour les appels systeme getxgid(2), getxuid(2) et getxpid(2) specifiques a l'architecture. Les autres architectures n'utilisent pas le registre de la seconde valeur renvoyee dans l'interface de l'appel systeme, meme s'il est defini dans l'ABI de System V. Le second tableau montre les registres utilises pour passer les parametres de l'appel systeme. Arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7 Notes --------------------------------------------------------------- alpha a0 a1 a2 a3 a4 a5 - arc r0 r1 r2 r3 r4 r5 - arm/OABI r0 r1 r2 r3 r4 r5 r6 arm/EABI r0 r1 r2 r3 r4 r5 r6 arm64 x0 x1 x2 x3 x4 x5 - blackfin R0 R1 R2 R3 R4 R5 - i386 ebx ecx edx esi edi ebp - ia64 out0 out1 out2 out3 out4 out5 - loongarch a0 a1 a2 a3 a4 a5 a6 m68k d1 d2 d3 d4 d5 a0 - microblaze r5 r6 r7 r8 r9 r10 - mips/o32 a0 a1 a2 a3 - - - 1 mips/n32, 64 a0 a1 a2 a3 a4 a5 - nios2 r4 r5 r6 r7 r8 r9 - parisc r26 r25 r24 r23 r22 r21 - powerpc r3 r4 r5 r6 r7 r8 r9 powerpc64 r3 r4 r5 r6 r7 r8 - riscv a0 a1 a2 a3 a4 a5 - s390 r2 r3 r4 r5 r6 r7 - s390x r2 r3 r4 r5 r6 r7 - superh r4 r5 r6 r7 r0 r1 r2 sparc/32 o0 o1 o2 o3 o4 o5 - sparc/64 o0 o1 o2 o3 o4 o5 - tile R00 R01 R02 R03 R04 R05 - x86-64 rdi rsi rdx r10 r8 r9 - x32 rdi rsi rdx r10 r8 r9 - xtensa a6 a3 a4 a5 a8 a9 - Notes : - La convention d'appel systeme mips/o32 passe les arguments 5 a 8 sur la pile utilisateur. Notez que ces tableaux ne couvrent pas l'ensemble des conventions d'appel systeme, certaines architectures peuvent ecraser sans distinction d'autres registres non listes ici. EXEMPLES #define _GNU_SOURCE #include #include #include int main(void) { pid_t tid; tid = syscall(SYS_gettid); syscall(SYS_tgkill, getpid(), tid, SIGHUP); } VOIR AUSSI _syscall(2), intro(2), syscalls(2), errno(3), vdso(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et bubu Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 syscall(2)