.\" -*- coding: UTF-8 -*- .\" Copyright 1996, Tom Bjorkholm .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH mremap 2 "8 février 2026" "Linux man\-pages 6.18" .SH NOM mremap \- Modifier une projection de la mémoire virtuelle .SH BIBLIOTHÈQUE Bibliothèque C standard (\fIlibc\fP,\ \fI\-lc\fP) .SH SYNOPSIS .nf \fB#define _GNU_SOURCE\fP /* Consultez feature_test_macros(7) */ \fB#include \fP .P \fBvoid *mremap(\fPsize_t old_size; \fB void \fP\fIold_address\fP\fB[\fP\fIold_size\fP\fB], size_t \fP\fIold_size\fP\fB,\fP \fB size_t \fP\fInew_size\fP\fB, int \fP\fIflags\fP\fB, ... /* void *\fP\fInew_address\fP\fB */);\fP .fi .SH DESCRIPTION \fBmremap\fP() 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 \fIflags\fP et de la place disponible dans l'espace d'adressage virtuel). .P Mappings can also simply be moved (without any resizing) by specifying equal \fIold_size\fP and \fInew_size\fP and using the \fBMREMAP_FIXED\fP flag (see below). Since Linux 6.17, while \fIold_address\fP must be mapped, \fIold_size\fP may span multiple mappings including unmapped areas between them when performing a simple move. The \fBMREMAP_DONTUNMAP\fP flag may also be specified. .P Similarly, if the operation performs a shrink, that is, if \fIold_size\fP is greater than \fInew_size\fP, then \fIold_size\fP may also span multiple mappings, which do not have to be adjacent to one another. If this shrink is performed in\-place, that is, neither \fBMREMAP_FIXED\fP, nor \fBMREMAP_DONTUNMAP\fP are specified, \fInew_size\fP may also span multiple VMAs. However, if the range is moved, then \fInew_size\fP must span only a single mapping. .P If the operation is neither a \fBMREMAP_FIXED\fP move nor a shrink, then \fIold_size\fP must span only a single mapping. .P \fIold_address\fP is the old address of the first virtual memory block that you want to expand, shrink, and/or move. Note that \fIold_address\fP has to be page aligned. \fIold_size\fP is the size of the range containing virtual memory blocks to be manipulated. \fInew_size\fP is the requested size of the virtual memory blocks after the resize. An optional fifth argument, \fInew_address\fP, may be provided; see the description of \fBMREMAP_FIXED\fP below. .P Si la valeur de \fIold_size\fP est de zéro et si \fIold_address\fP renvoie à une projection partageable (voir la description de \fBMAP_SHARED\fP dans \fBmmap\fP(2)), \fBmremap\fP() créera une nouvelle projection des mêmes pages. \fInew_size\fP sera la taille de la nouvelle projection et l'emplacement de la nouvelle projection peut être indiqué avec \fInew_address\fP ; voir la description de \fBMREMAP_FIXED\fP ci\-dessous. Si une nouvelle projection est demandée à l'aide de cette méthode, l'attribut \fBMREMAP_MAYMOVE\fP doit être indiqué également. .P L'argument de masquage \fIflags\fP est soit \fB0\fP, soit un des attributs suivants\ : .TP \fBMREMAP_MAYMOVE\fP Par défaut, s'il n'y a pas suffisamment d'espace pour agrandir une projection à son emplacement actuel, \fBmremap\fP() é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). .TP \fBMREMAP_FIXED\fP (depuis Linux 2.3.31) Ce drapeau a un but similaire à \fBMAP_FIXED\fP pour \fBmmap\fP(2). S'il est utilisé, \fBmremap\fP() prend un cinquième argument \fIvoid\ *new_address\fP 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 \fInew_address\fP et \fInew_size\fP est supprimée. .IP Si \fBMREMAP_FIXED\fP est indiqué, \fBMREMAP_MAYMOVE\fP doit également être indiqué. .IP Since Linux 6.17, if \fIold_size\fP is equal to \fInew_size\fP and \fBMREMAP_FIXED\fP is specified, then \fIold_size\fP may span beyond the mapping in which \fIold_address\fP resides. In this case, gaps between mappings in the original range are maintained in the new range. The whole operation is performed atomically unless an error arises, in which case the operation may be partially completed, that is, some mappings may be moved and others not. .IP Moving multiple mappings is not permitted if any of those mappings have either been registered with \fBuserfaultfd\fP(2), or map drivers that specify their own custom address mapping logic. .TP \fBMREMAP_DONTUNMAP\fP (depuis Linux 5.7) .\" commit e346b3813067d4b17383f975f197a9aa28a3b077 This flag, which must be used in conjunction with \fBMREMAP_MAYMOVE\fP, remaps mappings to a new address but does not unmap them from their original address. .IP The \fBMREMAP_DONTUNMAP\fP flag can be used only with mappings that are not \fBVM_DONTEXPAND\fP or \fBVM_PFNMAP\fP. Before Linux 5.13, the \fBMREMAP_DONTUNMAP\fP flag could be used only with private anonymous mappings (see the description of \fBMAP_PRIVATE\fP and \fBMAP_ANONYMOUS\fP in \fBmmap\fP(2)). .IP À la fin, tous les accès à la plage indiquée par \fIold_address\fP et \fIold_size\fP donneront une erreur de pagination. Elle sera gérée par un gestionnaire \fBuserfaultfd\fP(2) si l'adresse se situe dans une plage précédemment enregistrée avec \fBuserfaultfd\fP(2). Sinon, le noyau alloue une page remplie de zéros pour gérer cette erreur. .IP L'attribut \fBMREMAP_DONTUNMAP\fP 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 \fBMREMAP_DONTUNMAP\fP. .P If the memory segments specified by \fIold_address\fP and \fIold_size\fP are locked (using \fBmlock\fP(2) or similar), then this lock is maintained when the segments are resized and/or relocated. As a consequence, the amount of memory locked by the process may change. .SH "VALEUR RENVOYÉE" On success \fBmremap\fP() returns a pointer to the new virtual memory area. On error, the value \fBMAP_FAILED\fP (that is, \fI(void\ *)\ \-1\fP) is returned, and \fIerrno\fP is set to indicate the error. .SH ERREURS .TP \fBEAGAIN\fP L'appelant a tenté d'agrandir un segment de mémoire verrouillé, mais c'est impossible sans dépasser la limite \fBRLIMIT_MEMLOCK\fP. .TP \fBEFAULT\fP Some address in the range \fIold_address\fP to \fIold_address\fP+\fIold_size\fP is an invalid virtual memory address for this process. You can also get \fBEFAULT\fP even if there exist mappings that cover the whole address space requested, but those mappings are of different types, and the \fBmremap\fP() operation being performed does not support this. .TP \fBEINVAL\fP Un paramètre non valable a été donné. Parmi les causes possibles : .RS .IP \- 3 \fIold_address\fP n'était pas aligné sur une page ; .IP \- une autre valeur que \fBMREMAP_MAYMOVE\fP, \fBMREMAP_FIXED\fP ou \fBMREMAP_DONTUNMAP\fP a été indiquée dans \fIflags\fP ; .IP \- \fInew_size\fP était zéro ; .IP \- \fInew_size\fP ou \fInew_address\fP n'était pas valable ; .IP \- la nouvelle plage d'adresses indiquée par \fInew_address\fP et \fInew_size\fP chevauche l'ancienne plage d'adresses indiquée par \fIold_address\fP et \fIold_size\fP ; .IP \- \fBMREMAP_FIXED\fP ou \fBMREMAP_DONTUNMAP\fP était indiqué sans \fBMREMAP_MAYMOVE\fP ; .IP \- \fBMREMAP_DONTUNMAP\fP était indiqué mais une ou plusieurs pages de la plage indiquée par \fIold_address\fP et \fIold_size\fP n'étaient pas privées et anonymes ; .IP \- \fBMREMAP_DONTUNMAP\fP était indiqué et \fIold_size\fP n'était pas égal à \fInew_size\fP ; .IP \- \fIold_size\fP était de zéro et \fIold_address\fP ne renvoie pas à une projection partageable (mais voir BOGUES) ; .IP \- \fIold_size\fP valait zéro et l'attribut \fBMREMAP_MAYMOVE\fP n'était pas indiqué. .RE .TP \fBENOMEM\fP Pas assez de mémoire disponible pour terminer l'opération. Les causes possibles sont : .RS .IP \- 3 La zone de mémoire ne peut pas être agrandie à l'emplacement virtuel actuel, et l'option \fBMREMAP_MAYMOVE\fP n'a pas été fournie dans \fIflags\fP. Ou encore, il n'y a plus assez de mémoire (virtuelle) disponible. .IP \- \fBMREMAP_DONTUNMAP\fP 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. .RE .SH NORMES Linux. .SH HISTORIQUE .\" 4.2BSD had a (never actually implemented) .\" .BR mremap (2) .\" call with completely different semantics. .\" .P Avant la glibc 2.4, glibc ne fournissait pas la définition de \fBMREMAP_FIXED\fP et le prototype de \fBmremap\fP() ne permettait pas de passer le paramètre \fInew_address\fP. .SH NOTES \fBmremap\fP() modifie la correspondance entre les adresses virtuelles et les pages de mémoire. Ce mécanisme peut être utilisé pour implémenter un \fBrealloc\fP(3) très efficace. .P 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 (\fBSIGSEGV\fP) 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. .P .\" Si \fBmremap\fP() est utilisé pour déplacer ou étendre une zone verrouillée avec \fBmlock\fP(2) ou équivalent, l'appel \fBmremap\fP() fera le maximum pour remplir la nouvelle zone mais il n'échouera pas avec \fBENOMEM\fP si la zone ne peut pas être remplie. .SS "Cas d'utilisation de MREMAP_DONTUNMAP" Parmi les applications possibles de \fBMREMAP_DONTUNMAP\fP : .IP \- 3 \fBuserfaultfd\fP(2) non coopératif : une application peut retirer une plage d'adresses virtuelles en utilisant \fBMREMAP_DONTUNMAP\fP, puis utiliser un gestionnaire \fBuserfaultfd\fP(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. .IP \- Récupérateur de mémoire : \fBMREMAP_DONTUNMAP\fP peut être utilisé avec \fBuserfaultfd\fP(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 \fBPROT_NONE\fP ainsi que l'utilisation d'un gestionnaire \fBSIGSEGV\fP pour capter les accès à ces pages. .SH BOGUES .\" commit dba58d3b8c5045ad89c1c95d33d01451e3964db7 Avant Linux 4.14, si \fIold_size\fP valait zéro et si la projection à laquelle renvoyait \fIold_address\fP était une projection privée (voir la description de \fBMAP_PRIVATE\fP dans \fBmmap\fP(2)), \fBmremap\fP() 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 \fBmremap\fP() étant de créer une nouvelle projection à partir de celle d'origine). Depuis Linux 4.14, \fBmremap\fP() échoue avec l'erreur \fBEINVAL\fP dans ce scénario. .SH "VOIR AUSSI" \fBbrk\fP(2), \fBgetpagesize\fP(2), \fBgetrlimit\fP(2), \fBmlock\fP(2), \fBmmap\fP(2), \fBsbrk\fP(2), \fBmalloc\fP(3), \fBrealloc\fP(3) .P Votre manuel favori à propos de systèmes d'exploitation, pour des informations supplémentaires sur la mémoire paginée (par exemple \fIModern Operating Systems\fP de Andrew S.\& Tanenbaum, \fIInside Linux\fP par Randolf Bentson, \fIThe Design of the UNIX Operating System\fP par Maurice J.\& Bach) .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Jean-Philippe MENGUAL . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .