Man page - vdso(7)

Packages contains this manual

Available languages:

en fr ja ru

Manual

vDSO

NOM
SYNOPSIS
DESCRIPTION
Contexte exemple
Trouver le vDSO
Format de fichier
NOTES
Source
Noms vDSO
strace(1), seccomp(2) et le vDSO
NOTES SPÉCIFIQUES AUX ARCHITECTURES
Fonctions ARM
Fonctions aarch64
Fonctions bfin (Blackfin) (portage supprimé dans Linux 4.17)
Fonctions mips
Fonctions ia64 (Itanium)
Fonctions parisc (hppa)
Fonctions ppc/32
Fonctions ppc/64
Fonctions riscv
Fonctions s390
Fonctions s390x
Fonctions sh (SuperH)
Fonctions i386
Fonctions x86-64
Fonctions x86/x32
Historique
VOIR AUSSI
TRADUCTION

NOM

vdso – PrĂ©sentation de l’objet partagĂ© dynamique ELF virtuel

SYNOPSIS

#include <sys/auxv.h>

void *vdso = (uintptr_t) getauxval(AT_SYSINFO_EHDR);

DESCRIPTION

Le « vDSO » (objet partagĂ© dynamique virtuel, « virtual dynamic shared object ») est une petite bibliothĂšque partagĂ©e que le noyau projette automatiquement dans l’espace d’adresses de toutes les applications en espace utilisateur. Les applications n’ont normalement pas besoin de s’occuper elles-mĂȘmes de ces dĂ©tails puisque le vDSO est d’habitude appelĂ© par la bibliothĂšque C. Ainsi, vous pouvez Ă©crire du code normalement en utilisant les fonctions standards et la bibliothĂšque C s’occupera d’utiliser toutes les fonctionnalitĂ©s disponibles par l’intermĂ©diaire du vDSO.

Pourquoi le vDSO existe ? Certains appels systĂšme fournis par le noyau finissent par ĂȘtre utilisĂ©s frĂ©quemment par le code en espace utilisateur, au point que ces appels peuvent avoir une emprise excessive sur les performances. C’est Ă  la fois dĂ» Ă  la frĂ©quence des appels qu’aux nombreux changements de contexte Ă  force de sortir de l’espace utilisateur pour entrer dans le noyau.

La suite de cette documentation est orientĂ©e pour les curieux et les auteurs de la bibliothĂšque C plutĂŽt que pour les dĂ©veloppeurs gĂ©nĂ©raux. Si vous essayez d’appeler le vDSO dans vos propres applications plutĂŽt que d’utiliser la bibliothĂšque C, vous faites sans doute fausse route.

Contexte exemple

RĂ©aliser des appels systĂšme peut ĂȘtre lent. Dans les systĂšmes 32 bits x86, vous pouvez dĂ©clencher une interruption logicielle ( int $0x80 ) pour indiquer au noyau que vous voulez faire un appel systĂšme. Cependant, cette instruction est coĂ»teuse : elle passe par tous les chemins complets de traitement des interruptions dans le microcode du processeur ainsi que dans le noyau. Les nouveaux processeurs ont des instructions plus rapides (mais non rĂ©trocompatibles) pour initier les appels systĂšme. PlutĂŽt que forcer la bibliothĂšque C Ă  vĂ©rifier si cette fonctionnalitĂ© est disponible au moment de l’exĂ©cution, la bibliothĂšque C peut utiliser les fonctions fournies par le noyau dans le vDSO.

Remarquez que cette terminologie peut ĂȘtre source de confusion. Sur les systĂšmes x86, la fonction vDSO utilisĂ©e pour dĂ©terminer la mĂ©thode prĂ©fĂ©rĂ©e pour rĂ©aliser un appel systĂšme est appelĂ©e « __kernel_vsyscall » alors que sous x86_64, le terme « vsyscall » se rĂ©fĂšre aussi Ă  une façon obsolĂšte de demander au noyau l’heure ou le processeur sur lequel est l’appelant.

Un appel systĂšme frĂ©quemment utilisĂ© est gettimeofday (2). Cet appel systĂšme est appelĂ© Ă  la fois directement par les applications en espace utilisateur et indirectement par la bibliothĂšque C. Remarquez que les horodatages, boucles temporelles ou scrutations — ont tous frĂ©quemment besoin de savoir l’heure exacte. Ce n’est pas non plus un secret — n’importe quelle application dans n’importe quel mode (superutilisateur ou utilisateur normal) aura la mĂȘme rĂ©ponse. Alors le noyau s’arrange pour que les informations nĂ©cessaires pour rĂ©pondre Ă  cette question soient placĂ©es dans la mĂ©moire accessible au processus. Ainsi un appel de gettimeofday (2) est transformĂ© d’un appel systĂšme en un appel normal de fonction, avec peu d’accĂšs mĂ©moire.

Trouver le vDSO

L’adresse de base du vDSO (s’il existe) est passĂ©e par le noyau Ă  tous les programmes dans le vecteur auxiliaire initial (consultez getauxval (3)) Ă  l’aide de l’indicateur AT_SYSINFO_EHDR .

Vous ne devez pas supposer que le vDSO est projetĂ© Ă  un endroit particulier de la projection en mĂ©moire de l’utilisateur. L’adresse de base sera normalement alĂ©atoire au moment de l’exĂ©cution Ă  chaque fois qu’une nouvelle image de processus est créée (au moment de execve (2)). C’est ainsi pour des raisons de sĂ©curitĂ©, afin d’éviter les attaques de « retour vers libc ».

Pour certaines architectures, un indicateur AT_SYSINFO est aussi prĂ©sent. Il n’est utilisĂ© que pour localiser le point d’entrĂ©e vsyscall et est souvent omis ou dĂ©fini Ă  0 (signifiant qu’il n’est pas disponible). Cet indicateur est un rappel du fonctionnement initial de vDSO (consultez Historique ci-dessous) et son utilisation devrait ĂȘtre Ă©vitĂ©e.

Format de fichier

Puisque le vDSO est une image ELF complĂšte, vous pouvez y rechercher des symboles. Cela permet d’ajouter de nouveaux symboles avec les versions de noyau plus rĂ©centes et permet Ă  la bibliothĂšque C de dĂ©tecter les fonctionnalitĂ©s disponibles au moment de l’exĂ©cution lors de l’exĂ©cution sous diffĂ©rentes versions de noyau. D’habitude, la bibliothĂšque C fera la dĂ©tection lors du premier appel puis mettra en cache le rĂ©sultat pour les appels suivants.

Tous les appels sont aussi versionnĂ©s (en utilisant le format de version GNU). Cela permet au noyau de mettre Ă  jour la signature de fonction sans casser la rĂ©trocompatibilitĂ©. Cela signifie modifier les arguments acceptĂ©s par la fonction et la valeur de retour. Ainsi, lors de la recherche de symboles dans le vDSO, vous devez toujours inclure la version pour correspondre Ă  l’ABI attendue.

Typiquement, le vDSO suit la convention de nommage de préfixer tous les symboles par « __vdso_ » ou « __kernel_ » afin de les distinguer des autres symboles standards. Par exemple, la fonction « gettimeofday » est nommée « __vdso_gettimeofday ».

Utilisez les conventions d’appel C standard pour appeler n’importe laquelle de ces fonctions. Pas la peine de vous embĂȘter avec les registres bizarres ou les comportements de pile.

NOTES

Source

Lors de la compilation du noyau, le code vDSO est compilĂ© et liĂ© automatiquement. Il se trouve souvent dans le rĂ©pertoire spĂ©cifique Ă  l’architecture :

find arch/$ARCH/ -name '*vdso*.so*' -o -name '*gate*.so*'

Noms vDSO

Le nom du vDSO dépend des architectures. Il est souvent visible dans des endroits comme la sortie de ldd (1) de la glibc. Le nom exact ne devrait affecter aucun code, donc pas la peine de le coder en dur.

Image grohtml-3847577-1.png

strace(1), seccomp(2) et le vDSO

Lors du suivi des appels systĂšme avec strace (1), les symboles (appels systĂšme) qui sont exportĂ©s par le vDSO n’ apparaĂźtront pas dans la sortie du suivi. De mĂȘme, ces appels systĂšme ne seront pas visibles par les filtres seccomp (2).

NOTES SPÉCIFIQUES AUX ARCHITECTURES

Les sous-sections suivantes fournissent des notes spécifiques aux architectures sur le vDSO.

Remarquez que le vDSO utilisĂ© est basĂ© sur l’ABI du code en espace utilisateur et non sur l’ABI du noyau. Ainsi, par exemple, si vous exĂ©cutez un binaire ELF 32 bits i386, vous obtiendrez le mĂȘme vDSO que vous l’exĂ©cutiez avec un noyau 32 bits i386 ou avec un noyau 64 bits x86_64. Par consĂ©quent, le nom de l’ABI en espace utilisateur devrait ĂȘtre utilisĂ© pour dĂ©terminer la section suivante adĂ©quate.

Fonctions ARM

Le tableau suivant indique les symboles exportés par le vDSO.

Image grohtml-3847577-2.png

De plus, le portage ARM a une page de code pleine de fonctions utilitaires. Puisque ce n’est qu’une page de code brut, aucune information ELF n’existe pour faire la recherche de symboles ou le versionnage. Elle fournit cependant une prise en charge pour plusieurs versions.

Pour des renseignements sur cette page de code, mieux vaut consulter la documentation du noyau puisqu’elle est extrĂȘmement dĂ©taillĂ©e et couvre tous ce que vous devez savoir : Documentation/arm/kernel_user_helpers.rst .

Fonctions aarch64

Le tableau suivant indique les symboles exportés par le vDSO.

Image grohtml-3847577-3.png

Fonctions bfin (Blackfin) (portage supprimé dans Linux 4.17)

Comme ce processeur n’a pas d’unitĂ© de gestion mĂ©moire (MMU), il ne dĂ©finit pas de vDSO au sens usuel. À la place, il projette au dĂ©marrage quelques fonctions brutes Ă  un endroit spĂ©cifique de la mĂ©moire. Les applications en espace utilisateur appellent ensuite directement dans cette zone. Aucune mesure de rĂ©trocompatibilitĂ© n’est prise Ă  part en sniffant les codes opĂ©ratoires bruts, mais comme il s’agit d’un processeur embarquĂ©, il peut s’en sortir impunĂ©ment – certains formats d’objet qu’il exĂ©cute ne sont mĂȘme pas basĂ©s sur ELF (ils sont bFLT/FLAT).

Pour des renseignements sur cette page de code, mieux vaut consulter la documentation publique :
http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:fixed-code

Fonctions mips

Le tableau suivant indique les symboles exportés par le vDSO.

Image grohtml-3847577-4.png

Fonctions ia64 (Itanium)

Le tableau suivant indique les symboles exportés par le vDSO.

Image grohtml-3847577-5.png

Le portage Itanium est un peu pĂ©rilleux. En plus du vDSO ci-dessus, il a aussi des « appels systĂšme lĂ©gers » (aussi appelĂ©s « appels systĂšme rapides » ou « fsys »). Ils peuvent ĂȘtre appelĂ©s Ă  l’aide de l’assistant vDSO __kernel_syscall_via_epc . Les appels systĂšme indiquĂ©s ici ont la mĂȘme sĂ©mantique que si vous les appeliez directement Ă  l’aide de syscall (2), donc consultez la documentation adĂ©quate pour chacun d’entre eux. Le tableau suivant indique les fonctions disponibles par ce mĂ©canisme.

Image grohtml-3847577-6.png

Fonctions parisc (hppa)

Le portage parisc Ă  une page de code pleine de fonctions utilitaires appelĂ©e une page passerelle. PlutĂŽt que d’utiliser l’approche classique du vecteur auxiliaire ELF, il passe l’adresse de la page au processus Ă  l’aide du registre SR2. Les permissions sur la page sont telles qu’exĂ©cuter simplement ces adresses s’exĂ©cute automatiquement avec les droits du noyau et pas en espace utilisateur. C’est ainsi afin de correspondre au mode de fonctionnement HP-UX.

Puisque ce n’est qu’une page de code brut, aucune information ELF n’existe pour faire la recherche de symboles ou le versionnage. Appelez simplement l’adresse adĂ©quate Ă  l’aide de l’instruction de branche, par exemple :

ble <offset>(%sr2, %r0)

Image grohtml-3847577-7.png

Fonctions ppc/32

Le tableau suivant indique les symboles exportés par le vDSO. Les fonctions marquées avec un * ne sont disponibles que si le noyau est PowerPC64 (64 bits).

Image grohtml-3847577-8.png

Avant Linux 5.6, les horloges CLOCK_REALTIME_COARSE et CLOCK_MONOTONIC_COARSE ne sont pas prises en charge par les interfaces __kernel_clock_getres et __kernel_clock_gettime . Le noyau a recours Ă  l’appel systĂšme rĂ©el.

Fonctions ppc/64

Le tableau suivant indique les symboles exportés par le vDSO.

Image grohtml-3847577-9.png

Avant Linux 4.16, les horloges CLOCK_REALTIME_COARSE et CLOCK_MONOTONIC_COARSE ne sont pas prises en charge par les interfaces __kernel_clock_getres et __kernel_clock_gettime . Le noyau a recours Ă  l’appel systĂšme rĂ©el.

Fonctions riscv

Le tableau suivant indique les symboles exportés par le vDSO.

Image grohtml-3847577-10.png

Fonctions s390

Le tableau suivant indique les symboles exportés par le vDSO.

Image grohtml-3847577-11.png

Fonctions s390x

Le tableau suivant indique les symboles exportés par le vDSO.

Image grohtml-3847577-12.png

Fonctions sh (SuperH)

Le tableau suivant indique les symboles exportés par le vDSO.

Image grohtml-3847577-13.png

Fonctions i386

Le tableau suivant indique les symboles exportés par le vDSO.

Image grohtml-3847577-14.png

Fonctions x86-64

Le tableau suivant indique les symboles exportés par le vDSO. Tous ces symboles sont aussi disponibles sans le préfixe « __vdso_ », mais vous devriez les ignorer et vous cantonner aux noms suivants.

Image grohtml-3847577-15.png

Fonctions x86/x32

Le tableau suivant indique les symboles exportés par le vDSO.

Image grohtml-3847577-16.png

Historique

Le vDSO n’était Ă  l’origine qu’une seule fonction — le vsyscall. Dans les anciens noyaux, ce nom pourrait ĂȘtre vu dans une projection en mĂ©moire de processus Ă  la place de « vdso ». Le temps passant, les gens ont rĂ©alisĂ© que ce mĂ©canisme Ă©tait un excellent moyen pour passer plus de fonctionnalitĂ©s Ă  l’espace utilisateur, il a donc Ă©tĂ© reconçu en tant que vDSO au format actuel.

VOIR AUSSI

syscalls (2), getauxval (3), proc (5)

Les documents, exemples et le code source dans l’arborescence du code source de Linux :

Documentation/ABI/stable/vdso
Documentation/ia64/fsys.rst
Documentation/vDSO/* (contient des exemples d’utilisation du vDSO)

find arch/ -iname '*vdso*' -o -iname '*gate*'

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 Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>

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 .