MREMAP(2) Manuel du programmeur Linux MREMAP(2)
NOM
mremap - Modifier une projection (mapping) 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 incor
rectement (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 effi
cace.
OPTIONS
Ces valeurs sont combinées par un OU binaire ( | ) dans le
champ flags lors de l'appel de mremap.
Linux 8 Avril 1997 1
MREMAP(2) Manuel du programmeur Linux MREMAP(2)
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 projec
tion 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.
CONFORMITÉ
Cet appel systeme est spécifique à Linux et ne doit pas
être employé dans des programmes conçus pour être porta
bles. BSD 4.2 a un appel système mremap(2) avec une séman
tique 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, 1997.
Linux 8 Avril 1997 2