Provided by: manpages-fr-dev_3.57d1p1-1_all bug

NOM

       mremap - Modifier une projection de la mémoire virtuelle

SYNOPSIS

       #define _GNU_SOURCE         /* Consultez feature_test_macros(7) */
       #include <sys/mman.h>

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

DESCRIPTION

       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. Un 5e argument, new_address, peut éventuellement être fourni ;
       voyez la description de MREMAP_FIXED ci-dessous.

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

       Votre  manuel  favori  à  propos  de  systèmes  d'exploitation,  pour   des   informations
       supplémentaires  sur la mémoire paginée : Modern Operating Systems de Andrew S. Tanenbaum,
       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.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/>.

       Christophe    Blaess    <http://www.blaess.fr/christophe/>   (1996-2003),   Alain   Portal
       <http://manpagesfr.free.fr/>  (2003-2006).  Julien  Cristau  et  l'équipe  francophone  de
       traduction de Debian (2006-2009).

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