dwww Home | Manual pages | Find package

vDSO(7)                Miscellaneous Information Manual                vDSO(7)

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 ap-
       pelé par la bibliothèque C. Ainsi, vous pouvez écrire du code  normale-
       ment  en utilisant les fonctions standards et la bibliothèque C s’occu-
       pera 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  utilisa-
       teur,  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 utilisa-
       teur 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. Cepen-
       dant, cette instruction est coûteuse : elle passe par tous les  chemins
       complets  de  traitement des interruptions dans le microcode du proces-
       seur ainsi que dans le noyau. Les nouveaux processeurs ont des instruc-
       tions  plus rapides (mais non rétrocompatibles) pour initier les appels
       système. Plutôt que forcer la bibliothèque C à vérifier si cette  fonc-
       tionnalité  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.

       One frequently used system call is gettimeofday(2). This system call is
       called both directly by user-space applications as well  as  indirectly
       by  the  C  library. Think timestamps or timing loops or polling—all of
       these frequently need to know what time it is right now. This  informa-
       tion  is also not secret—any application in any privilege mode (root or
       any unprivileged user) will get the same answer. Thus  the  kernel  ar-
       ranges  for the information required to answer this question to be pla-
       ced in memory the process can access. Now  a  call  to  gettimeofday(2)
       changes  from  a system call to a normal function call and a few memory
       accesses.

   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 getaux-
       val(3)) à l’aide de l’indicateur AT_SYSINFO_EHDR.

       Vous ne devez pas supposer que le vDSO est projeté à un endroit  parti-
       culier  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 (consul-
       tez 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  ver-
       sions  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 biblio-
       thè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 ver-
       sion GNU). Cela permet au noyau de mettre à jour la signature de  fonc-
       tion  sans casser la rétrocompatibilité. Cela signifie modifier les ar-
       guments 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 la-
       quelle de ces fonctions. Pas la peine de  vous  embêter  avec  les  re-
       gistres bizarres ou les comportements de pile.

NOTES
   Source
       Lors  de la compilation du noyau, le code vDSO est compilé et lié auto-
       matiquement. Il se trouve souvent dans le répertoire spécifique à l’ar-
       chitecture :

           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 de-
       vrait affecter aucun code, donc pas la peine de le coder en dur.

       ABI utilisateur   Nom vDSO
       ────────────────────────────────────
       aarch64           linux-vdso.so.1
       arm               linux-vdso.so.1
       ia64              linux-gate.so.1
       mips              linux-vdso.so.1
       ppc/32            linux-vdso32.so.1
       ppc/64            linux-vdso64.so.1
       riscv             linux-vdso.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

   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  sor-
       tie  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  ar-
       chitectures sur le vDSO.

       Remarquez que le vDSO utilisé est basé sur l’ABI du code en espace uti-
       lisateur et non sur l’ABI du noyau. Ainsi, par exemple, si vous  exécu-
       tez  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 uti-
       lisé pour déterminer la section suivante adéquate.

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

       symbole                version
       ────────────────────────────────────────────────────────────
       __vdso_gettimeofday    LINUX_2.6 (exported since Linux 4.1)
       __vdso_clock_gettime   LINUX_2.6 (exported since Linux 4.1)

       De plus, le portage ARM a une page de code pleine de  fonctions  utili-
       taires.  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.

       For information on this code page, it's best to refer to the kernel do-
       cumentation as it's extremely detailed and covers everything  you  need
       to know: Documentation/arm/kernel_user_helpers.rst.

   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) (portage supprimé dans Linux 4.17)
       As  this  CPU lacks a memory management unit (MMU), it doesn't set up a
       vDSO in the normal sense. Instead, it maps at boot time a few raw func-
       tions  into  a  fixed  location in memory. User-space applications then
       call directly into that region. There is no provision for backward com-
       patibility beyond sniffing raw opcodes, but as this is an embedded CPU,
       it can get away with things—some of the object formats it  runs  aren't
       even ELF based (they're 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.

       symbole                  version
       ──────────────────────────────────────────────────────────────────
       __kernel_gettimeofday    LINUX_2.6 (exportation depuis Linux 4.4)
       __kernel_clock_gettime   LINUX_2.6 (exportation depuis Linux 4.4)

   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 à l’aide  de  l’assis-
       tant 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 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)

       offset   fonction
       ───────────────────────────────────────────────────
       00b0     lws_entry (opérations CAS)
       00e0     set_thread_pointer (utilisé par la glibc)
       0100     linux_gateway_entry (syscall)

   Fonctions ppc/32
       Le tableau suivant indique les symboles exportés par le vDSO. Les fonc-
       tions  marquées  avec  un * ne sont disponibles que si le noyau est Po-
       werPC64 (64 bits).

       symbole                    version
       ────────────────────────────────────────
       __kernel_clock_getres      LINUX_2.6.15
       __kernel_clock_gettime     LINUX_2.6.15
       __kernel_clock_gettime64   LINUX_5.11
       __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

       Before Linux 5.6, the CLOCK_REALTIME_COARSE and  CLOCK_MONOTONIC_COARSE
       clocks  are  not  supported  by  the  __kernel_clock_getres  and __ker-
       nel_clock_gettime interfaces; the kernel falls back to the real  system
       call.

   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

       Before Linux 4.16, the CLOCK_REALTIME_COARSE and CLOCK_MONOTONIC_COARSE
       clocks are  not  supported  by  the  __kernel_clock_getres  and  __ker-
       nel_clock_gettime  interfaces; the kernel falls back to the real system
       call.

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

       symbole                version
       ──────────────────────────────────
       __vdso_rt_sigreturn    LINUX_4.15
       __vdso_gettimeofday    LINUX_4.15
       __vdso_clock_gettime   LINUX_4.15
       __vdso_clock_getres    LINUX_4.15
       __vdso_getcpu          LINUX_4.15
       __vdso_flush_icache    LINUX_4.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

       __vdso_clock_gettime    LINUX_2.6 (exportation depuis Linux 3.15)
       __vdso_gettimeofday     LINUX_2.6 (exportation depuis Linux 3.15)
       __vdso_time             LINUX_2.6 (exportation depuis Linux 3.15)

   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
       The vDSO was originally just a single function—the vsyscall.  In  older
       kernels,  you might see that name in a process's memory map rather than
       "vdso". Over time, people realized that this mechanism was a great  way
       to  pass  more  functionality to user space, so it was reconceived as a
       vDSO in the current format.

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/* (includes examples of using the vDSO)

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

TRADUCTION
       La  traduction française de cette page de manuel a été créée par Chris-
       tophe Blaess <https://www.blaess.fr/christophe/>, Stéphan  Rafin  <ste-
       phan.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.cou-
       lon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>,  Thomas  Huriaux
       <thomas.huriaux@gmail.com>,  Nicolas François <nicolas.francois@centra-
       liens.net>, Florentin Duneau <fduneau@gmail.com>, Simon  Paillard  <si-
       mon.paillard@resel.enst-bretagne.fr>,    Denis   Barbier   <barbier@de-
       bian.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
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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⟩.

Pages du manuel de Linux 6.03   10 février 2023                        vDSO(7)

Generated by dwww version 1.15 on Sat Jun 29 01:44:04 CEST 2024.