MREMAP
Section: Manuel du programmeur Linux (2) Updated: 18 juillet 2003 Index
NOM
SYNOPSIS
DESCRIPTION
OPTIONS
VALEUR RENVOYÉE
ERREURS
NOTES
CONFORMITÉ
VOIR AUSSI
TRADUCTION
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.
|
|