Provided by: manpages-fr_3.57d1p1-1_all bug

NOM

       vDSO - Panorama de l’objet partagé dynamique ELF virtuel

SYNOPSIS

       #include <sys/auxv.h>

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

DESCRIPTION

       Le  « vDSO »  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ée 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 la
       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  — qui
       ont tous fréquemment besoin de savoir l’heure exacte. Ce n’est pas non plus un secret — de
       n’importe quelle application dans n’importe quel  mode  (superutilisateur  ou  utilisateur
       normal)  auront  tous  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 un 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 du type 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 type 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).  Ce  type  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,  la  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.

       ABI utilisateur   nom vDSO
       ────────────────────────────────────
       aarch64           linux-vdso.so.1
       ia64              linux-gate.so.1
       ppc/32            linux-vdso32.so.1
       ppc/64            linux-vdso64.so.1
       s390              linux-vdso32.so.1
       s390x             linux-vdso64.so.1
       sh                linux-gate.so.1
       i386              linux-gate.so.1
       x86_64            linux-vdso.so.1
       x86/x32           linux-vdso.so.1

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 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 de la recherche de  symboles
       ou du versionnement. 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.txt.

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

       symbole                  version
       ──────────────────────────────────────
       __kernel_rt_sigreturn    LINUX_2.6.39
       __kernel_gettimeofday    LINUX_2.6.39
       __kernel_clock_gettime   LINUX_2.6.39
       __kernel_clock_getres    LINUX_2.6.39

   Fonctions bfin (Blackfin)
       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 ia64 (Itanium)
       Le tableau suivant indique les symboles exportés par le vDSO.

       symbole                      version
       ───────────────────────────────────────
       __kernel_sigtramp            LINUX_2.5
       __kernel_syscall_via_break   LINUX_2.5
       __kernel_syscall_via_epc     LINUX_2.5

       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 en à 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.

       fonction
       ────────────────
       clock_gettime
       getcpu
       getpid
       getppid
       gettimeofday
       set_tid_address

   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  de
       la  recherche  de  symboles  ou  du versionnement. Appelez simplement l’adresse adéquate à
       l’aide de l’instruction de branche, par exemple :

           ble <adresse>(%sr2, %r0)

       adresse   fonction
       ────────────────────────────────────────
       00b0      lws_entry
       00e0      set_thread_pointer
       0100      linux_gateway_entry (syscall)
       0268      syscall_nosys
       0274      tracesys
       0324      tracesys_next
       0368      tracesys_exit
       03a0      tracesys_sigexit
       03b8      lws_start
       03dc      lws_exit_nosys
       03e0      lws_exit
       03e4      lws_compare_and_swap64
       03e8      lws_compare_and_swap
       0404      cas_wouldblock
       0410      cas_action

   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).

       symbole                    version
       ────────────────────────────────────────
       __kernel_clock_getres      LINUX_2.6.15
       __kernel_clock_gettime     LINUX_2.6.15
       __kernel_datapage_offset   LINUX_2.6.15
       __kernel_get_syscall_map   LINUX_2.6.15
       __kernel_get_tbfreq        LINUX_2.6.15
       __kernel_getcpu *          LINUX_2.6.15
       __kernel_gettimeofday      LINUX_2.6.15
       __kernel_sigtramp_rt32     LINUX_2.6.15
       __kernel_sigtramp32        LINUX_2.6.15
       __kernel_sync_dicache      LINUX_2.6.15
       __kernel_sync_dicache_p5   LINUX_2.6.15

   Fonctions ppc/64
       Le tableau suivant indique les symboles exportés par le vDSO.

       symbole                    version
       ────────────────────────────────────────
       __kernel_clock_getres      LINUX_2.6.15
       __kernel_clock_gettime     LINUX_2.6.15
       __kernel_datapage_offset   LINUX_2.6.15
       __kernel_get_syscall_map   LINUX_2.6.15
       __kernel_get_tbfreq        LINUX_2.6.15
       __kernel_getcpu            LINUX_2.6.15
       __kernel_gettimeofday      LINUX_2.6.15
       __kernel_sigtramp_rt64     LINUX_2.6.15
       __kernel_sync_dicache      LINUX_2.6.15
       __kernel_sync_dicache_p5   LINUX_2.6.15

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

       symbole                  version
       ──────────────────────────────────────
       __kernel_clock_getres    LINUX_2.6.29
       __kernel_clock_gettime   LINUX_2.6.29
       __kernel_gettimeofday    LINUX_2.6.29

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

       symbole                  version
       ──────────────────────────────────────
       __kernel_clock_getres    LINUX_2.6.29
       __kernel_clock_gettime   LINUX_2.6.29
       __kernel_gettimeofday    LINUX_2.6.29

   Fonctions sh (SuperH)
       Le tableau suivant indique les symboles exportés par le vDSO.

       symbole                 version
       ──────────────────────────────────
       __kernel_rt_sigreturn   LINUX_2.6
       __kernel_sigreturn      LINUX_2.6
       __kernel_vsyscall       LINUX_2.6

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

       symbole                 version
       ──────────────────────────────────
       __kernel_sigreturn      LINUX_2.5
       __kernel_rt_sigreturn   LINUX_2.5
       __kernel_vsyscall       LINUX_2.5

   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.

       symbole                version
       ─────────────────────────────────
       __vdso_clock_gettime   LINUX_2.6
       __vdso_getcpu          LINUX_2.6
       __vdso_gettimeofday    LINUX_2.6
       __vdso_time            LINUX_2.6

   Fonctions x86/x32
       Le tableau suivant indique les symboles exportés par le vDSO.

       symbole                version
       ─────────────────────────────────
       __vdso_clock_gettime   LINUX_2.6
       __vdso_getcpu          LINUX_2.6
       __vdso_gettimeofday    LINUX_2.6
       __vdso_time            LINUX_2.6

   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.txt
           Documentation/vDSO/* (contient des exemples d’utilisation du vDSO)

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

COLOPHON

       Cette  page  fait partie de la publication 3.57 du projet man-pages Linux. Une description
       du projet et des  instructions  pour  signaler  des  anomalies  peuvent  être  trouvées  à
       l'adresse http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis    2010,    cette   traduction   est   maintenue   à   l'aide   de   l'outil   po4a
       <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du  projet
       perkamon <http://perkamon.alioth.debian.org/>.

       Veuillez     signaler     toute     erreur     de     traduction     en     écrivant     à
       <debian-l10n-french@lists.debian.org>  ou  par  un  rapport  de  bogue   sur   le   paquet
       manpages-fr.

       Vous  pouvez  toujours  avoir  accès  à la version anglaise de ce document en utilisant la
       commande « man -L C <section> <page_de_man> ».