NOM¶
mremap - Modifier une projection de la mémoire virtuelle
SYNOPSIS¶
#define _GNU_SOURCE /* Consultez feature_test_macros(7) */
#include <sys/mman.h>
void *mremap(void *old_address, size_t old_size,
size_t new_size, int flags, ... /* void *new_address */);
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. Un 5e argument,
new_address, peut éventuellement
être fourni ; voyez la description de
MREMAP_FIXED
ci-dessous.
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
flags est soit 0, soit un
OU binaire
« | » avec les options suivantes :
- MREMAP_MAYMOVE
- Par défaut, s'il n'y a pas suffisamment d'espace pour agrandir une
projection à son emplacement actuel, mremap() échoue.
Si ce drapeau est utilisé, le noyau est autorisé à
déplacer la projection à une autre adresse virtuelle si
nécessaire. Si la projection est déplacée, les
pointeurs absolus vers l'ancienne projection deviennent invalides (il faut
utiliser des différences par rapport à l'adresse de
début de la projection).
- MREMAP_FIXED (depuis Linux 2.3.31)
- Ce drapeau a un but similaire à MAP_FIXED pour
mmap(2). S'il est utilisé, mremap() prend un
cinquième argument void *new_address qui contient une
adresse alignée sur un début de page, vers laquelle la
projection doit être déplacée. Toute projection
existant précédemment dans la zone entre new_address
et new_address+new_size est supprimée. Si
MREMAP_FIXED est utilisé, MREMAP_MAYMOVE doit
l'être aussi.
Si le segment de mémoire indiqué par
old_address et
old_size est verrouillé (par
mlock(2) ou similaire), ce
verrou est maintenu quand le segment est modifié et/ou
déplacé. Par conséquent, la quantité de
mémoire verrouillée par le processus peut changer.
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 tenté d'agrandir un segment de mémoire
verrouillé, mais c'est impossible sans dépasser la limite
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 paramètre invalide a été utilisé. Les
causes possibles sont un mauvais alignement de old_address, une
valeur différente de MREMAP_MAYMOVE ou MREMAP_FIXED
dans flags, new_size à 0, new_size ou
new_address est invalide, ou la nouvelle zone
spécifiée par new_address et new_size recouvre
en partie l'ancienne zone définie par old_address et
old_size, ou enfin utilisation de MREMAP_FIXED sans
MREMAP_MAYMOVE.
- 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.
Cet appel système est spécifique à Linux et ne devrait pas
être employé dans des programmes destinés à
être portables.
NOTES¶
Avant la version 2.4, la glibc ne fournissait pas la définition de
MREMAP_FIXED et le prototype de
mremap() ne permettait pas de
passer le paramètre
new_address.
VOIR AUSSI¶
brk(2),
getpagesize(2),
getrlimit(2),
mlock(2),
mmap(2),
sbrk(2),
malloc(3),
realloc(3)
Votre manuel favori à propos de systèmes d'exploitation, pour des
informations supplémentaires sur la mémoire
paginée :
Modern Operating Systems de Andrew S.
Tanenbaum,
Inside Linux par Randolf Bentson,
The Design of
the UNIX Operating System par Maurice J. Bach.
COLOPHON¶
Cette page fait partie de la publication 3.65 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et
l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce
document en utilisant la commande «
man -L C
<section>
<page_de_man> ».