Loading

NOM

       mremap - Modifier une projection de la mémoire virtuelle

SYNOPSIS

       #define _GNU_SOURCE
       #include <sys/mman.h>

       void *mremap(void *old_address, size_t old_size,
                    size_t new_size, int flags);

       mremap()  agrandit  (ou  diminue)  une  projection  (Ndt :  mapping) de
       mémoire virtuelle en mémoire réelle,  en  la  déplaçant  éventuellement
       (sous  contrôle  de  l’argument  flags  et  de la place disponible dans
       l’espace d’adressage virtuel).

       old_address est l’ancienne adresse  du  bloc  de  mémoire  virtuelle  à
       agrandir  (ou  à  diminuer).  Veuillez  noter que old_address doit être
       alignée sur une frontière de page. old_size est la taille  du  bloc  de
       mémoire  virtuelle. new_size est la taille désirée pour le nouveau bloc
       de mémoire.

       Sous Linux, la mémoire est divisée en pages. Un  processus  utilisateur
       dispose  d’un  ou  plusieurs segments linéaires de mémoire virtuelle. À
       chaque segment correspond une ou plusieurs projections dans  les  pages
       de  mémoire réelle (dans la table des pages). Chaque segment de mémoire
       virtuelle dispose de ses propres droits d’accès (sa protection), ce qui
       peut  déclencher  des fautes de segmentation si la mémoire est utilisée
       incorrectement (par exemple, en écrivant dans  un  segment  en  lecture
       seule).  De  même  une  tentative  d’accès  à  la mémoire en‐dehors des
       segments déclenche également une faute de segmentation.

       mremap() utilise le schéma de la table des  pages  de  Linux.  mremap()
       modifie la correspondance entre les adresses virtuelles et les pages de
       mémoire réelle. Ce mécanisme peut  être  utilisé  pour  implémenter  un
       realloc(3) très efficace.

       L’argument  flags est soit 0, soit un OU binaire « | » avec les options
       suivantes :

       MREMAP_MAYMOVE
              Par défaut, s’il n’y a pas suffisamment d’espace  pour  agrandir
              une  projection à son emplacement actuel, mremap() échoue. Si ce
              drapeau est  utilisé,  le  noyau  est  autorisé  à  déplacer  la
              projection  à  une  autre adresse virtuelle si nécessaire. Si la
              projection est déplacée, les pointeurs absolus  vers  l’ancienne
              projection   deviennent   invalides   (il   faut   utiliser  des
              différences par rapport à l’adresse de début de la  projection).

       MREMAP_FIXED (depuis Linux 2.3.31)
              Ce drapeau a un but similaire à MAP_FIXED pour mmap(2). S’il est
              utilisé, mremap() prend un cinquième argument void  *new_address
              qui  contient  une  adresse  alignée  sur un début de page, vers
              laquelle la projection  doit  être  déplacée.  Toute  projection
              existant   précédemment   dans  la  zone  entre  new_address  et
              new_address+new_size est supprimée. Si MREMAP_FIXED est utilisé,
              MREMAP_MAYMOVE doit l’être aussi.

       Si  le  segment  de  mémoire  indiqué  par  old_address et old_size est
       verrouillé (par mlock(2) ou similaire), ce verrou est maintenu quand le
       segment  est  modifié  et/ou  déplacé.  Par  conséquent, la quantité de
       mémoire verrouillée par le processus peut changer.

VALEUR RENVOYÉE

       mremap() renvoie un pointeur sur la nouvelle zone de mémoire  virtuelle
       s’il  réussit.  En  cas  d’échec,  la  valeur  MAP_FAILED (c’est-à-dire
       (void*) -1) est renvoyée et errno contient le code d’erreur.

ERREURS

       EAGAIN L’appelant a tenté d’agrandir un segment de mémoire  verrouillé,
              mais c’est impossible sans dépasser la limite RLIMIT_MEMLOCK.

       EFAULT Erreur  de  segmentation  (« Segmentation  fault »). Une adresse
              dans  l’intervalle  entre  old_address  et  old_address+old_size
              n’est  pas  une  adresse  virtuelle valide pour ce processus. On
              peut également obtenir EFAULT même s’il existe  des  projections
              recouvrant  la  zone complète demandée, mais que ces projections
              sont de types différents.

       EINVAL Un paramètre invalide a été utilisé. Les causes  possibles  sont
              un  mauvais  alignement de old_address, une valeur différente de
              MREMAP_MAYMOVE  ou  MREMAP_FIXED  dans  flags,  new_size  à   0,
              new_size  ou  new_address  est  invalide,  ou  la  nouvelle zone
              spécifiée  par  new_address  et  new_size  recouvre  en   partie
              l’ancienne  zone  définie  par old_address et old_size, ou enfin
              utilisation de MREMAP_FIXED sans MREMAP_MAYMOVE.

       ENOMEM La zone de mémoire ne peut pas  être  agrandie  à  l’emplacement
              actuel,  et  l’option  MREMAP_MAYMOVE  n’a  pas été fournie dans
              flags. Ou encore, il n’y  a  plus  assez  de  mémoire  virtuelle
              disponible.

CONFORMITÉ

       Cet  appel  système  est spécifique à Linux et ne doit pas être employé
       dans des programmes destinés à être portables.

NOTES

       Avant la version 2.4, la glibc ne  fournissait  pas  la  définition  de
       MREMAP_FIXED et le prototype de mremap() ne permettait pas de passer le
       paramètre new_address.

VOIR AUSSI

       brk(2),  getpagesize(2),  getrlimit(2),  mlock(2),  mmap(2),   sbrk(2),
       malloc(3), realloc(3), feature_test_macros(7)

       Votre  manuel de systèmes d’exploitations favori, pour des informations
       supplémentaires sur la mémoire paginée. (Modern  Operating  Systems  de
       Andrew  S.  Tannenbaum, Inside Linux par Randolf Bentson, The Design of
       the UNIX Operating System par Maurice J. Bach.)

COLOPHON

       Cette page fait partie de  la  publication  3.23  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

       Cette  page  de  manuel  a  été  traduite et mise à jour par Christophe
       Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis  par
       Alain  Portal  <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
       disposition sur http://manpagesfr.free.fr/.

       Les mises à jour et corrections de la version présente dans Debian sont
       directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
       francophone de traduction de Debian.

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