MREMAP
Section : Manuel du programmeur Linux (
2)
Mise à jour de la version anglaise : 13 septembre 2005
Index
Menu principal
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'emplacement actuel,
mremap()
échoue.
Si cet attribut est positionné, le noyau est autorisé à 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ébut de la projection).
- MREMAP_FIXED (depuis Linux 2.3.31)
-
Cet attribut a un objectif similaire à l'attribut
MAP_FIXED
de
mmap(2).
S'il 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 l'être.
Si le segment de mémoire indiqué 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 verrouillé
mais cela n'est pas possible sans dépasser la limite de ressources
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 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 destinés à être portables.
NOTES
Dans les versions antérieures à la 2.4,
la glibc ne fournissait 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)
Votre manuel de systèmes d'exploitation favori pour des informations
supplémentaires sur la mémoire paginée.
(
Modern Operating Systems par Andrew S. Tannenbaum,
Inside Linux par Randolf Bentson,
The Design of the UNIX Operating System par 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 23 juin 2008.
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.
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- CONFORMITÉ
-
- NOTES
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 23 juin 2008