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.
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 masque de bits
flags
peut être nul, ou contenir les attributs suivants :
-
- MREMAP_MAYMOVE
-
Par défaut, s'il n'y a pas suffisamment d'espace
pour redimensionner à l'endroit courant,
mremap()
échoue.
Si cet attribut est positionné, le noyau peut déplacer la projection
à la nouvelle adresse virtuelle, si nécessaire.
Si la projection est déplacée, les pointeurs absolus sur l'ancien
emplacement de la projection deviennent invalides (on devrait employer
des décalages relatifs à l'adresse de départ de la projection).
-
- MREMAP_FIXED (depuis Linux 2.3.31)
-
Cet attribut a un objectif similaire à l'attribut
MAP_FIXED
de
mmap(2).
Si cet attribut est spécifié,
mremap()
accepte un cinquième argument,
void *new_address,
qui spécifie une adresse vers laquelle sera déplacée la projection.
Cette adresse doit être alignée sur une frontière de page.
Toute projection précédente dans l'intervalle d'adresse spécifié par
new_address
est
new_size
est supprimée.
Si
MREMAP_FIXED
est spécifié,
MREMAP_MAYMOVE
doit également être spécifié.
Si le segment de mémoire spécifié par
old_address
et
old_size
est verrouillé (avec
mlock(2)
ou un appel similaire), le verrou est maintenu
lorsque le segment est redimmensionné ou déplacé.
En conséquence, la taille de la mémoire verrouillée par le processus
peut être modifiée.