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.44 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> ».