Man page - syscall(2)

Packages contains this manual

Available languages:

en fr es ja de

Manual

syscall

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
NOTES
Exigences dĂ©pendantes de l’architecture
Conventions d’appel par architecture
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

syscall - appel systĂšme indirect

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <sys/syscall.h> /* Définition des constantes SYS_* */
#include <unistd.h>

long syscall(long numéro , ...);

Exigences de macros de test de fonctionnalités 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 bibliothĂšque qui invoque l’appel systĂšme dont l’interface en assembleur a le numĂ©ro indiquĂ© avec les arguments donnĂ©s. L’utilisation de syscall () est pratique, par exemple, pour invoquer un appel systĂšme qui n’a pas de fonction d’enveloppe dans la bibliothĂšque C.

syscall () sauve les registres du processeur avant de faire l’appel systĂšme, restaure les registres au retour de l’appel systĂšme et stocke tous les codes d’erreur renvoyĂ©s par l’appel systĂšme dans errno (3).

Les constantes symboliques correspondant aux appels systĂšme sont dans le fichier d’en-tĂȘte <sys/syscall.h> .

VALEUR RENVOYÉE

La valeur de retour est dĂ©finie par l’appel systĂšme invoquĂ©. En gĂ©nĂ©ral, une valeur de retour 0 indique une rĂ©ussite. Une valeur de retour de -1 indique une erreur, et un code d’erreur est fourni dans errno .

ERREURS

ENOSYS

Le numĂ©ro d’appel systĂšme requis n’est pas implementĂ©.

D’autres erreurs sont spĂ©cifiques Ă  l’appel systĂšme invoquĂ©.

NOTES

syscall () est apparu dans 4BSD.

Exigences dĂ©pendantes de l’architecture

L’ABI de chaque architecture possĂšde ses propres exigences sur la façon dont les paramĂštres des appels systĂšme sont passĂ©s au noyau. Pour les appels systĂšme qui ont une fonction d’enveloppe de la glibc (comme par exemple la plupart des appels systĂšme), la glibc s’occupe des dĂ©tails pour copier les arguments dans les bons registres d’une maniĂšre adaptĂ©e Ă  chaque architecture. Cependant, en utilisant syscall () pour effectuer un appel systĂšme, l’appelant peut avoir besoin de gĂ©rer certains dĂ©tails dĂ©pendants de l’architecture ; cette exigence est en particulier rencontrĂ©e sur certaines architectures 32 bits.

Par exemple, pour l’Embedded ABI (EABI) de l’architecture ARM, une valeur 64 bits (c’est-Ă -dire un long long ) doit ĂȘtre alignĂ©e sur une paire de registres paire. Ainsi, en appelant syscall () au lieu de la fonction d’enveloppe fournie par la glibc, l’appel systĂšme readahead () devrait ĂȘtre effectuĂ© ainsi sur l’architecture ARM avec l’EABI :

syscall(SYS_readahead, fd, 0,
(unsigned int) (offset & 0xFFFFFFFF),
(unsigned int) (offset >> 32),
count);

Comme le paramĂštre offset est 64 bits, et le premier argument ( fd ) est passĂ© dans r0 , l’appelant doit manuellement dĂ©couper et aligner la valeur 64 bits afin de la passer dans la paire de registres r2 / r3 . Cela implique de passer une valeur fantĂŽme dans r1 (le second argument, qui vaut 0 ). Il faut Ă©galement veiller Ă  ce que la division respecte les conventions endian (selon l’ABI C de la plateforme).

Des problùmes 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 alignĂ©s, il utilise une couche shim pour cacher le rĂ©sultat de l’espace utilisateur.

Les appels systÚme concernés 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 systĂšme qui sĂ©parent 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 possĂšde sa façon propre d’invoquer et de passer des paramĂštres au noyau. Les dĂ©tails pour diverses architectures sont donnĂ©s dans les deux tableaux ci-dessous.

Le premier tableau liste l’instruction utilisĂ©e pour passer en mode noyau (qui n’est pas forcĂ©ment la mĂ©thode la meilleure ou la plus rapide, vous devriez consulter vdso (7)), le registre (ou les registres) utilisĂ©(s) pour indiquer le numĂ©ro de l’appel systĂšme, et le registre utilisĂ© comme code de retour de l’appel systĂšme, et le registre utilisĂ© pour signaler une erreur.

Image grohtml-3858198-1.png

Notes :

-

Sur quelques architectures, un registre est utilisĂ© comme un bolĂ©en ( 0 indiquant aucune erreur et -1 indiquant une erreur) pour signaler que l’appel systĂšme a Ă©chouĂ©. La valeur de l’erreur actuelle est toujours contenue dans le registre renvoyĂ©. Sur sparc, le bit de transport (carry bit, csr ) dans le registre d’état du processeur ( psr ) est utilisĂ© au lieu d’un registre entier. Sur powerpc64, le bit de dĂ©bordement (overflow bit) sommaire ( SO ) dans le champ 0 du registre de condition ( cr0 ) est utilisĂ©.

-

NR est le numĂ©ro de l’appel systĂšme.

-

Pour s390 et s390x, NR (le numĂ©ro de l’appel systĂšme) peut ĂȘtre passĂ© directement avec svc NR s’il est infĂ©rieur Ă  256.

-

Sur SuperH, des numĂ©ros de capture (« trap ») supplĂ©mentaires sont pris en charge pour des raisons historiques mais trapa #31 est l’ABI « unifiĂ©e » recommandĂ©e.

-

Les ABI x32 partagent la table syscall avec l’ABI x86-64, mais avec quelques nuances :

-

De maniĂšre Ă  indiquer qu’un appel systĂšme est appelĂ© sous une ABI x32, un bit additionnel, _X32_SYSCALL_BIT , est associĂ© par un OU binaire au numĂ©ro d’appel systĂšme. L’ABI utilise un processus qui influe sur le comportement des processus, comme le traitement des signaux ou redĂ©marrage d’un appel systĂšme.

-

Comme x32 a des tailles diffĂ©rentes 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 diffĂ©rentes. Pour manipuler cela des appels systĂšme supplĂ©mentaires sont ajoutĂ©s Ă  la table d’appel systĂšme, commençant au numĂ©ro 512 (sans le _X32_SYSCALL BIT ). Par exemple, _NR_ready est dĂ©fini à 19 pour l’ABI x86-64 et comme _X32_SYSCALL_BIT | 515 pour l’ABI x32. La plupart de ces appels systĂšme additionnels sont actuellement identiques aux appels systĂšme utilisĂ©s pour fournir la compatibilitĂ© i386. Cependant, il y a quelques exceptions notables, comme avec prreadv2 (2), qui utilisent une entitĂ© 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 (nommĂ©ment : Alpha, IA-64, MIPS, SuperH, sparc/32 et sparc/64) utilisent un registre additionnel (« Retval2 » dans la table ci-dessus) pour renvoyer une deuxiĂšme valeur de renvoi de l’appel systĂšme pipe (2) ; Alpha utilise aussi cette technique pour les appels systĂšme getxgid (2), getxuid (2) et getxpid (2) spĂ©cifiques Ă  l’architecture. Les autres architectures n’utilisent pas le registre de la seconde valeur renvoyĂ©e dans l’interface de l’appel systĂšme, mĂȘme s’il est dĂ©fini dans l’ABI de System V.

Le second tableau montre les registres utilisĂ©s pour passer les paramĂštres de l’appel systĂšme.

Image grohtml-3858198-2.png

Notes :

-

La convention d’appel systùme mips/o32 passe les arguments 5 à 8 sur la pile utilisateur.

Notez que ces tableaux ne couvrent pas l’ensemble des conventions d’appel systĂšme, certaines architectures peuvent Ă©craser sans distinction d’autres registres non listĂ©s ici.

EXEMPLES

#define _GNU_SOURCE
#include <signal.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
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 française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et bubu <bubub@no-log.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .