MREMAP(2)

NOM
mremap - Modifier une projection (mapping) de la memoire virtuelle.

SYNOPSIS
#include <unistd.h>
#include <sys/mman.h>

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

DESCRIPTION
mremap agrandit (ou diminue) une projection (mapping) de memoire virtuelle en memoire reelle, en la deplacant eventuellement (sous controle de l'argument flags et de la place disponible dans l'espace d'adressage virtuel). old_address est l'ancienne adresse du bloc de memoire virtuelle a agrandir (ou a diminuer). Notez que old_address doit etre alignee sur une frontiere de page. old_size est la taille du bloc de memoire virtuelle. new_size est la taille desiree pour le nouveau bloc de memoire. L'argument flags contient les options decrites plus bas. Sous Linux, la memoire est divisee en pages. Un processus utilisateur dispose d'un ou plusieurs segments lineaires de memoire virtuelle. A chaque segment correspond une ou plusieurs projections dans les pages de memoire reelle (dans la table des pages). Chaque segment de memoire virtuelle dispose de ses propres droits d'acces (sa protection), ce qui peut declencher des fautes de segmentation si la memoire est utilisee incorrectement (par exemple, en ecrivant dans un segment en lecture seule). De meme une tentative d'acces a la memoire en-dehors des segments declenche egalement une faute de segmentation. mremap utilise le schema de la table des pages de Linux. mremap modifie la correspondance entre les adresses virtuelles et les pages de memoire reelle. Ce mecanisme peut etre utilise pour implementer un realloc tres efficace.

OPTIONS
Ces valeurs sont combinees par un OU binaire ( | ) dans le champ flags lors de l'appel de mremap.

MREMAP_MAYMOVE
    indique que le bloc virtuel peut etre deplace si le redimensionnement ne peut pas etre effectue a la meme adresse virtuelle.

VALEUR RENVOYEE
mremap renvoie une pointeur sur la nouvelle zone de memoire virtuelle s'il reussit. En cas d'echec, -1 est renvoye et errno contient le code d'erreur.

ERREURS

EINVAL
    Un argument invalide a ete fourni. old_address n'etait probablement pas alignee sur une frontiere de pages.

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 egalement obtenir EFAULT meme s'il existe des projections recouvrant la zone complete demandee, mais que ces projections sont de types differents.

EAGAIN
    Le segment de memoire est verrouille et sa projection ne peut pas etre modifiee.

ENOMEM
    La zone de memoire ne peut pas etre agrandie a l'emplacement actuel, et l'option MREMAP_MAYMOVE n'a pas ete fournie dans flags. Ou encore il n'y a plus assez de memoire virtuelle disponible.

CONFORMITE
Cet appel systeme est specifique a Linux et ne doit pas etre employe dans des programmes concus pour etre portables. BSD 4.2 a un appel-systeme mremap(2) avec une semantique totalement differente.

VOIR AUSSI
getpagesize(2), realloc(3), malloc(3), brk(2), sbrk(2), mmap(2)

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