Man page - mremap(2)

Packages contains this manual

Available languages:

en fr ja de

Manual

mremap

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
Cas d’utilisation de MREMAP_DONTUNMAP
BOGUES
VOIR AUSSI
TRADUCTION

NOM

mremap - Modifier une projection de la mémoire virtuelle

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#define _GNU_SOURCE /* Consultez feature_test_macros(7) */
#include <sys/mman.h>

void *mremap(void old_address [. old_size ], 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 l’ancienne taille du bloc de mĂ©moire virtuelle. new_size est la taille dĂ©sirĂ©e pour le nouveau bloc de mĂ©moire. Un cinquiĂšme argument, new_address , peut Ă©ventuellement ĂȘtre fourni ; voyez la description de MREMAP_FIXED ci-dessous.

Si la valeur de old_size est de zĂ©ro et si old_address renvoie Ă  une projection partageable (voir la description de MAP_SHARED dans mmap (2)), mremap () crĂ©era une nouvelle projection des mĂȘmes pages. new_size sera la taille de la nouvelle projection et l’emplacement de la nouvelle projection peut ĂȘtre indiquĂ© avec new_address ; voir la description de MREMAP_FIXED ci-dessous. Si une nouvelle projection est demandĂ©e Ă  l’aide de cette mĂ©thode, l’attribut MREMAP_MAYMOVE doit ĂȘtre indiquĂ© Ă©galement.

L’argument de masquage flags est soit 0 , soit un des attributs suivants :
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 caduques (il faut utiliser des dĂ©calages 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_size est supprimĂ©e.

Si MREMAP_FIXED est indiquĂ©, MREMAP_MAYMOVE doit Ă©galement ĂȘtre indiquĂ©.

MREMAP_DONTUNMAP (depuis Linux 5.7)

Cet attribut, qui doit ĂȘtre utilisĂ© avec MREMAP_MAYMOVE , refait une projection vers une nouvelle adresse mais il ne supprime pas celle Ă  old_address .

L’attribut MREMAP_DONTUNMAP ne peut ĂȘtre utilisĂ© qu’avec des projections privĂ©es anonymes (voir la description de MAP_PRIVATE et de MAP_ANONYMOUS dans mmap (2)).

À la fin, tous les accĂšs Ă  la plage indiquĂ©e par old_address et old_size donneront une erreur de pagination. Elle sera gĂ©rĂ©e par un gestionnaire userfaultfd (2) si l’adresse se situe dans une plage prĂ©cĂ©demment enregistrĂ©e avec userfaultfd (2). Sinon, le noyau alloue une page remplie de zĂ©ros pour gĂ©rer cette erreur.

L’attribut MREMAP_DONTUNMAP peut ĂȘtre utilisĂ© pour dĂ©placer de maniĂšre atomique une projection tout en laissant la source associĂ©e. Voir les NOTES pour des applications possibles de MREMAP_DONTUNMAP .

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 est dĂ©fini pour indiquer l’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

Une adresse dans l’intervalle entre old_address et old_address + old_size n’est pas une adresse virtuelle valable 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 non valable a été donné. Parmi les causes possibles :

-

old_address n’était pas alignĂ© sur une page ;

-

une autre valeur que MREMAP_MAYMOVE , MREMAP_FIXED ou MREMAP_DONTUNMAP a été indiquée dans flags ;

-

new_size était zéro ;

-

new_size ou new_address n’était pas valable ;

-

la nouvelle plage d’adresses indiquĂ©e par new_address et new_size chevauche l’ancienne plage d’adresses indiquĂ©e par old_address et old_size ;

-

MREMAP_FIXED ou MREMAP_DONTUNMAP était indiqué sans MREMAP_MAYMOVE ;

-

MREMAP_DONTUNMAP Ă©tait indiquĂ© mais une ou plusieurs pages de la plage indiquĂ©e par old_address et old_size n’étaient pas privĂ©es et anonymes ;

-

MREMAP_DONTUNMAP Ă©tait indiquĂ© et old_size n’était pas Ă©gal Ă  new_size ;

-

old_size était de zéro et old_address ne renvoie pas à une projection partageable (mais voir BOGUES) ;

-

old_size valait zĂ©ro et l’attribut MREMAP_MAYMOVE n’était pas indiquĂ©.

ENOMEM

Pas assez de mĂ©moire disponible pour terminer l’opĂ©ration. Les causes possibles sont :

-

La zone de mĂ©moire ne peut pas ĂȘtre agrandie Ă  l’emplacement virtuel 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.

-

MREMAP_DONTUNMAP a Ă©tĂ© utilisĂ©, provoquant la crĂ©ation d’une nouvelle projection qui dĂ©passerait la mĂ©moire (virtuelle) disponible. Ou alors elle excĂ©derait le nombre maximal de projections autorisĂ©es.

STANDARDS

Linux.

HISTORIQUE

Avant la glibc 2.4, 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 .

NOTES

mremap () modifie la correspondance entre les adresses virtuelles et les pages de mĂ©moire. Ce mĂ©canisme peut ĂȘtre utilisĂ© pour implĂ©menter un realloc (3) trĂšs efficace.

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 ( SIGSEGV ) si l’accĂšs Ă  la mĂ©moire est mal gĂ©rĂ© (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 une faute de segmentation.

Si mremap () est utilisĂ© pour dĂ©placer ou Ă©tendre une zone verrouillĂ©e avec mlock (2) ou Ă©quivalent, l’appel mremap () fera le maximum pour remplir la nouvelle zone mais il n’échouera pas avec ENOMEM si la zone ne peut pas ĂȘtre remplie.

Cas d’utilisation de MREMAP_DONTUNMAP

Parmi les applications possibles de MREMAP_DONTUNMAP :

-

userfaultfd (2) non coopĂ©ratif : une application peut retirer une plage d’adresses virtuelles en utilisant MREMAP_DONTUNMAP , puis utiliser un gestionnaire userfaultfd (2) pour gĂ©rer les erreurs de pagination qui arrivent ensuite lorsque d’autres threads du processus crĂ©ent des pages dans la plage retirĂ©e.

-

RĂ©cupĂ©rateur de mĂ©moire : MREMAP_DONTUNMAP peut ĂȘtre utilisĂ© avec userfaultfd (2) pour implĂ©menter des algorithmes de ramasse-miettes (garbage collection) (par exemple, dans une machine virtuelle Java). Une telle implĂ©mentation peut ĂȘtre moins coĂ»teuse (et plus simple) que les techniques de collecte traditionnelles qui impliquent de marquer des pages avec une protection PROT_NONE ainsi que l’utilisation d’un gestionnaire SIGSEGV pour capter les accĂšs Ă  ces pages.

BOGUES

Avant Linux 4.14, si old_size valait zĂ©ro et si la projection Ă  laquelle renvoyait old_address Ă©tait une projection privĂ©e (voir la description de MAP_PRIVATE dans mmap (2)), mremap () crĂ©ait une nouvelle projection privĂ©e sans lien avec celle d’origine. Ce comportement Ă©tait intentionnel et probablement non prĂ©vu dans des applications de l’espace utilisateur (l’intention de mremap () Ă©tant de crĂ©er une nouvelle projection Ă  partir de celle d’origine). Depuis Linux 4.14, mremap () Ă©choue avec l’erreur EINVAL dans ce scĂ©nario.

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 (par exemple Modern Operating Systems de Andrew S. Tanenbaum, Inside Linux par Randolf Bentson, The Design of the UNIX Operating System par Maurice J. Bach)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .