mremap

Autres langues

Langue: fr

Version: 18 juillet 2003 (openSuse - 09/10/07)

Section: 2 (Appels système)

NOM

mremap - Modifier une projection de la mémoire 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 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). Notez 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.

L'argument flags contient les options décrites plus bas.

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. A 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 très efficace.

OPTIONS

Ces valeurs sont combinées par un OU binaire ( | ) dans le champ flags lors de l'appel de mremap.
MREMAP_MAYMOVE
indique que le bloc virtuel peut être déplacé si le redimensionnement ne peut pas être effectué à la même adresse virtuelle.

VALEUR RENVOYÉE

mremap renvoie une pointeur sur la nouvelle zone de mémoire virtuelle s'il réussit. En cas d'échec, -1 est renvoyé et errno contient le code d'erreur.

ERREURS

EINVAL
Un argument invalide a été fourni. old_address n'était probablement pas alignée sur une frontière 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 é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.
EAGAIN
Le segment de mémoire est verrouillé et sa projection ne peut pas être modifiée.
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.

NOTES

Avec la GlibC actuelle, pour obtenir la définition de la constante MREMAP_MAYMOVE, il faut définir _GNU_SOURCE avant d'inclure <sys/mman.h>.

CONFORMITÉ

Cet appel système est spécifique à Linux et ne doit pas être employé dans des programmes conçus pour être portables. BSD 4.2 a un appel système mremap(2) avec une sémantique totalement différente.

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

TRADUCTION

Christophe Blaess, 1996-2003.