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. |
CONFORMITÉ
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 [AT] lists.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> ».