MREMAP(2)

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

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. 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 masque de bits flags peut être nul, ou contenir les attributs suivants :

MREMAP_MAYMOVE
    Par défaut, s'il n'y a pas suffisamment d'espace pour redimensionner à l'endroit courant, mremap() échoue. Si cet attribut est positionné, le noyau peut déplacer la projection à la nouvelle adresse virtuelle, si nécessaire. Si la projection est déplacée, les pointeurs absolus sur l'ancien emplacement de la projection deviennent invalides (on devrait employer des décalages relatifs à l'adresse de départ de la projection).

MREMAP_FIXED (depuis Linux 2.3.31)
    Cet attribut a un objectif similaire à l'attribut MAP_FIXED de mmap(2). Si cet attribut est spécifié, mremap() accepte un cinquième argument, void *new_address, qui spécifie une adresse vers laquelle sera déplacée la projection. Cette adresse doit être alignée sur une frontière de page. Toute projection précédente dans l'intervalle d'adresse spécifié par new_address est new_size est supprimée. Si MREMAP_FIXED est spécifié, MREMAP_MAYMOVE doit également être spécifié.

Si le segment de mémoire spécifié par old_address et old_size est verrouillé (avec mlock(2) ou un appel similaire), le verrou est maintenu lorsque le segment est redimmensionné ou déplacé. En conséquence, la taille de la mémoire verrouillée par le processus peut être modifiée.

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 essayé d'agrandir un segment de mémoire qui est verrouillé mais cela n'est pas possible sans dépasser la limite de ressources RLIMIT_MEMLOCK. Le segment de mémoire est verrouillé et sa projection ne peut pas être modifiée.

EFAULT
    "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 argument invalide a été fourni. Les causes possibles sont : old_address n'était probablement pas alignée sur une frontière de pages ; une valeur autre que MREMAP_MAYMOVE ou MREMAP_FIXED a été spécifiée dans flags ; new_size est nul ; new_size ou new_address n'est pas valide ; ou le nouvel intervalle d'adresses spécifié par new_address et new_size chevauche l'ancien intervalle d'adresses spécifié par old_address et old_size ; ou MREMAP_FIXED était spécifié sans que MREMAP_MAYMOVE le soit également.

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 utilisé dans des programmes conçus pour être portables.

NOTES
Dans les versions précédant la 2.4, la glibc n'exposait pas la définition de MREMAP_FIXED, et le prototype de mremap() n'acceptait pas l'argument new_address.

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

(Modern Operating Systems by Andrew S. Tannenbaum, Inside Linux by Randolf Bentson, The Design of the UNIX Operating System by Maurice J. Bach.)

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 14 octobre 1996 et révisée le 22 décembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 mremap ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.