.\" -*- coding: UTF-8 -*-
.\" Copyright (C) Michael Kerrisk, 2004
.\" using some material drawn from earlier man pages
.\" written by Thomas Kuhn, Copyright 1996
.\"
.\" %%%LICENSE_START(GPLv2+_DOC_FULL)
.\" This is free documentation; you can redistribute it and/or
.\" modify it under the terms of the GNU General Public License as
.\" published by the Free Software Foundation; either version 2 of
.\" the License, or (at your option) any later version.
.\"
.\" The GNU General Public License's references to "object code"
.\" and "executables" are to be interpreted as the output of any
.\" document formatting or typesetting system, including
.\" intermediate and printed output.
.\"
.\" This manual is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public
.\" License along with this manual; if not, see
.\" .
.\" %%%LICENSE_END
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH MLOCK 2 "11 avril 2020" Linux "Manuel du programmeur Linux"
.SH NOM
mlock, mlock2, munlock, mlockall, munlockall \- Verrouiller et déverrouiller
la mémoire
.SH SYNOPSIS
.nf
\fB#include \fP
.PP
\fBint mlock(const void *\fP\fIaddr\fP\fB, size_t \fP\fIlen\fP\fB);\fP
\fBint mlock2(const void *\fP\fIaddr\fP\fB, size_t \fP\fIlen\fP\fB, int \fP\fIflags\fP\fB);\fP
\fBint munlock(const void *\fP\fIaddr\fP\fB, size_t \fP\fIlen\fP\fB);\fP
.PP
\fBint mlockall(int \fP\fIflags\fP\fB);\fP
\fBint munlockall(void);\fP
.fi
.SH DESCRIPTION
\fBmlock\fP(), \fBmlock2\fP() et \fBmlockall\fP() verrouillent tout ou partie de
l'espace d'adressage du processus appelant dans la mémoire physique pour
empêcher cette mémoire d'être évincée dans l'espace d'échange (swap).
.PP
\fBmunlock\fP() et \fBmunlockall\fP() ont l'effet inverse, respectivement
déverrouillant une partie ou l'ensemble de l'espace d'adressage du processus
appelant, afin que les pages dans la zone indiquée puissent à nouveau être
évincées dans l'espace d'échange si le gestionnaire de mémoire du noyau
l'exige.
.PP
Le verrouillage et le déverrouillage de la mémoire s'effectuent sur des
unités de page entière.
.SS "mlock(), mlock2() et munlock()"
\fBmlock\fP() verrouille les pages sur \fIlen\fP octets à partir de l'adresse
\fIaddr\fP. Toutes les pages qui contiennent une partie de la zone mémoire
indiquée ont la garantie de résider en mémoire principale quand l'appel
réussit\ ; elles ont la garantie de rester en mémoire principale jusqu'à
leur déverrouillage.
.PP
.\" commit a8ca5d0ecbdde5cc3d7accacbd69968b0c98764e
.\" commit de60f5f10c58d4f34b68622442c0e04180367f3f
.\" commit b0f205c2a3082dd9081f9a94e50658c5fa906ff1
\fBmlock\fP() verrouille aussi les pages de la plage indiquée sur \fIlen\fP octets
à partir de l'adresse \fIaddr\fP. Néanmoins, l'état des pages contenues dans
cette plage après un appel réussi dépendra de la valeur du paramètre
\fIflags\fP.
.PP
L'argument \fIflags\fP peut être \fB0\fP ou la constante suivante\ :
.TP
\fBMLOCK_ONFAULT\fP
Verrouiller les pages actuellement résidentes et marquer toute la plage pour
que le reste des pages non résidentes se verrouillent quand elles se
remplissent d'erreurs de pagination.
.PP
Si \fIflags\fP vaut \fB0\fP, \fBmlock2\fP() se comporte exactement comme \fBmlock\fP().
.PP
\fBmunlock\fP() déverrouille la mémoire sur \fIlen\fP octets à partir de l'adresse
\fIaddr\fP. Après cet appel, toutes les pages contenant une partie de la zone
mémoire indiquée peuvent de nouveau être évincées dans l'espace d'échange
par le noyau.
.SS "mlockall() et munlockall()"
\fBmlockall\fP() verrouille toutes les pages projetées dans l'espace
d'adressage du processus appelant. Cela inclut les pages de code, de données
et de pile, ainsi que les bibliothèques partagées, les données utilisateur
dans le noyau, la mémoire partagée, et les fichiers projetés en
mémoire. Toutes les pages projetées ont la garantie de résider en mémoire
principale quand l'appel réussit\ ; elles ont la garantie de rester en
mémoire principale jusqu'à leur déverrouillage.
.PP
L'argument \fIflags\fP est composé d'un \fIOU\fP binaire avec les options
suivantes\ :
.TP
\fBMCL_CURRENT\fP
Verrouiller toutes les pages actuellement projetées dans l'espace
d'adressage du processus.
.TP
\fBMCL_FUTURE\fP
Verrouiller toutes les pages qui seront projetées dans l'espace d'adressage
du processus dans le futur. Il peut s'agir, par exemple, de nouvelles pages
nécessitées par la croissance du tas et de la pile, ou de nouveaux fichiers
projetés en mémoire, ou des zones de mémoire partagée.
.TP
\fBMCL_ONFAULT\fP (depuis Linux 4.4)
Utilisé avec \fBMCL_CURRENT\fP, \fBMCL_FUTURE\fP ou les deux. Marquer toutes les
projections actuelles (avec \fBMCL_CURRENT\fP) ou futures (avec \fBMCL_FUTURE\fP)
pour verrouiller les pages quand elles contiennent des erreurs. Si on
l'utilise avec \fBMCL_CURRENT\fP, toutes les pages présentes sont verrouillées
mais \fBmlockall\fP() ne rencontrera pas d'erreur sur des pages non
présentes. Quand on l'utilise avec \fBMCL_FUTURE\fP, toutes les projections
futures seront marquées pour verrouiller les pages quand elles rencontreront
une erreur, mais elles ne seront pas remplies par le verrou lors de la
création de la projection. \fBMCL_ONFAULT\fP doit être utilisé avec
\fBMCL_CURRENT\fP, \fBMCL_FUTURE\fP ou les deux.
.PP
Si \fBMCL_FUTURE\fP a été utilisé, un appel système ultérieur
(p.ex. \fBmmap\fP(2), \fBsbrk\fP(2), \fBmalloc\fP(3)) risque d'échouer s'il cause un
dépassement du nombre d'octets verrouillés autorisé (voir
ci\(hydessous). Dans les mêmes circonstances, la croissance de la pile
risque également d'échouer\ : le noyau interdira l'augmentation de la pile
et enverra le signal \fBSIGSEGV\fP au processus.
.PP
\fBmunlockall\fP() déverrouille toutes les pages projetées dans l'espace
d'adressage du processus appelant.
.SH "VALEUR RENVOYÉE"
S'ils réussissent, ces appels système renvoient \fB0\fP. En cas d'erreur, ils
renvoient \fB\-1\fP, \fIerrno\fP est positionné adéquatement et les verrouillages
de l'espace d'adressage du processus ne sont pas modifiés.
.SH ERREURS
.TP
\fBENOMEM\fP
(Linux\ 2.6.9 et plus récents) L'appelant avait une limite souple
\fBRLIMIT_MEMLOCK\fP non nulle, mais a tenté de verrouiller plus de mémoire que
la quantité autorisée. Cette limite n'est pas imposée si le processus est
privilégié (\fBCAP_IPC_LOCK\fP).
.TP
\fBENOMEM\fP
.\" In the case of mlock(), this check is somewhat buggy: it doesn't
.\" take into account whether the to-be-locked range overlaps with
.\" already locked pages. Thus, suppose we allocate
.\" (num_physpages / 4 + 1) of memory, and lock those pages once using
.\" mlock(), and then lock the *same* page range a second time.
.\" In the case, the second mlock() call will fail, since the check
.\" calculates that the process is trying to lock (num_physpages / 2 + 2)
.\" pages, which of course is not true. (MTK, Nov 04, kernel 2.4.28)
(Linux\ 2.4 et précédents) Le processus appelant a essayé de verrouiller plus
de la moitié de la mémoire vive.
.TP
\fBEPERM\fP
.\"SVr4 documents an additional EAGAIN error code.
L'appelant n'est pas privilégié mais a besoin de droits (\fBCAP_IPC_LOCK\fP)
pour réaliser les opérations demandées.
.PP
Pour \fBmlock\fP(), \fBmlock2\fP() et \fBmunlock\fP()\ :
.TP
\fBEAGAIN\fP
Une partie (ou l'ensemble) de l'espace d'adressage indiqué n'a pas pu être
verrouillée.
.TP
\fBEINVAL\fP
La somme de \fIaddr\fP+\fIlen\fP était inférieure à \fIaddr\fP (l'addition aurait pu
conduire à un dépassement par exemple).
.TP
\fBEINVAL\fP
(Pas sous Linux) \fIaddr\fP n'est pas un multiple de la taille de la page.
.TP
\fBENOMEM\fP
Une partie de la zone indiquée ne correspond pas à des pages projetées dans
l'espace d'adressage du processus.
.TP
\fBENOMEM\fP
.\" I.e., the number of VMAs would exceed the 64kB maximum
Le verrouillage ou le déverrouillage d'une région ferait dépasser le nombre
maximum de projections permises ayant des attributs distincts (comme
verrouillé contre déverrouillé). Par exemple, le déverrouillage d'une plage
située au milieu d'une projection actuellement verrouillée donnerait trois
projections\ : deux verrouillées de chaque côté et une déverrouillée au
milieu.
.PP
Pour \fBmlock2\fP()\ :
.TP
\fBEINVAL\fP
Des \fIflags\fP inconnus étaient demandés.
.PP
Pour \fBmlockall\fP()\ :
.TP
\fBEINVAL\fP
Des \fIflags\fP inconnus ont été indiqués ou \fBMCL_ONFAULT\fP a été indiqué sans
\fBMCL_FUTURE\fP ou \fBMCL_CURRENT\fP.
.PP
Pour \fBmunlockall\fP()\ :
.TP
\fBEPERM\fP
(Linux 2.6.8 et précédents) L'appelant n'est pas privilégié
(\fBCAP_IPC_LOCK\fP).
.SH VERSIONS
\fBmlock2\fP() est disponible depuis Linux 4.4\ ; la glibc le gère depuis la
version 2.27.
.SH CONFORMITÉ
POSIX.1\-2001, POSIX.1\-2008, SVr4.
.PP
\fBmlock2\fP() est spécifique à Linux.
.PP
Sur les systèmes POSIX où \fBmlock\fP() et \fBmunlock\fP() sont disponibles, la
constante symbolique \fB_POSIX_MEMLOCK_RANGE\fP est définie dans
\fI\fP et le nombre d'octets par page peut être déterminé
grâce à la constante \fBPAGESIZE\fP si définie dans \fI\fP ou en
appelant \fIsysconf(_SC_PAGESIZE)\fP.
.PP
.\" POSIX.1-2001: It shall be defined to -1 or 0 or 200112L.
.\" -1: unavailable, 0: ask using sysconf().
.\" glibc defines it to 1.
Sur les systèmes POSIX sur lesquels \fBmlockall\fP() et \fBmunlockall\fP() sont
disponibles, la constante symbolique \fB_POSIX_MEMLOCK\fP est définie dans
\fI\fP comme étant une valeur supérieure à \fB0\fP. (Consultez
aussi \fBsysconf\fP(3).)
.SH NOTES
Il y a deux domaines principaux d'applications du verrouillage de pages\ :
les algorithmes en temps réel et le traitement de données
confidentielles. Les applications temps réel réclament un comportement
temporel déterministe, et la pagination est, avec l'ordonnancement, une
cause majeure de délais imprévus. Ces algorithmes basculent habituellement
sur un ordonnancement temps\(hyréel avec \fBsched_setscheduler\fP(2). Les
logiciels de cryptographie manipulent souvent quelques octets hautement
confidentiels, comme des mots de passe ou des clés privées. À cause de la
pagination, ces données secrètes risquent d'être transférées sur un support
physique où elles pourraient être lues par un ennemi longtemps après que le
logiciel se soit terminé. Soyez toutefois conscient que le mode suspendu sur
les portables et certains ordinateurs de bureau sauvegardent une copie de la
mémoire sur le disque, quels que soient les verrouillages.
.PP
Les processus temps\(hyréel utilisant \fBmlockall\fP() pour éviter les délais
dus à la pagination doivent réserver assez de pages verrouillées pour la
pile avant d'entrer dans la section temporellement critique, afin qu'aucun
défaut de page ne survienne lors d'un appel de fonction. Cela peut être
obtenu en appelant une fonction qui alloue une variable automatique
suffisamment grande (comme un tableau) et écrit dans la mémoire occupée par
ce tableau afin de modifier ces pages de pile. Ainsi, suffisamment de pages
seront projetées pour la pile et pourront être verrouillées. Les écritures
bidon permettent de s'assurer que même les pages copiées à l'écriture ne
causeront pas de défaut de page dans la section critique.
.PP
Les verrouillages de mémoire ne sont pas récupérés par un enfant lors d'un
\fBfork\fP(2) et sont automatiquement supprimés (déverrouillés) au cours d'un
\fBexecve\fP(2) ou lorsque le processus se termine. Les paramètres
\fBMCL_FUTURE\fP et \fBMCL_FUTURE | MCL_ONFAULT\fP de \fBmlockall\fP() ne sont pas
récupérés par un enfant créé par \fBfork\fP(2) et sont effacés au cours d'un
\fBexecve\fP(2).
.PP
Remarquez que \fBfork\fP(2) préparera l'espace d'adressage pour une opération
copie\-en\-écriture. La conséquence est que tout accès en écriture consécutif
créera une erreur de pagination qui, elle\-même, peut causer des latences
importantes dans un processus en temps réel. Il est donc crucial de ne pas
appeler \fBfork\fP(2) après des opérations \fBmlockall\fP() ou \fBmlock\fP()\ ; même à
partir d'un thread qui tourne en priorité basse dans un processus dont un
thread tourne en priorité haute.
.PP
Le verrouillage de mémoire sur une zone est automatiquement enlevé si la
zone est invalidée par \fBmunmap\fP(2).
.PP
Il n'y a pas d'empilement des verrouillages mémoire, ce qui signifie qu'une
page verrouillée plusieurs fois par des appels \fBmlock\fP(), \fBmlock2\fP() ou
\fBmlockall\fP() sera libérée en un seul appel à \fBmunlock\fP() pour la zone
mémoire correspondante ou par un appel à \fBmunlockall\fP(). Les pages qui sont
projetées à plusieurs endroits ou par plusieurs processus restent
verrouillées en mémoire vive tant qu'il y a au moins un processus ou une
zone qui les verrouille.
.PP
Si un appel à \fBmlockall\fP(), qui utilise l'attribut \fBMCL_FUTURE\fP, est suivi
d'un autre appel qui n'indique pas cet attribut, les changements effectués
par l'appel \fBMCL_FUTURE\fP seront perdus.
.PP
L'attribut \fBMLOCK_ONFAULT\fP de \fBmlock2\fP() et celui \fBMCL_ONFAULT\fP de
\fBmlockall\fP() permettent un verrouillage efficace de la mémoire pour les
applications qui ont à faire à de grandes projections où seulement une
(petite) partie des pages de la projection sont modifiées. Dans ce cas, le
verrouillage de toutes les pages d'une projection risquerait une sanction
lourde de verrouillage de mémoire.
.SS "Notes pour Linux"
Sous Linux, \fBmlock\fP(), \fBmlock2\fP() et \fBmunlock\fP() arrondissent
automatiquement \fIaddr\fP à la frontière de page la plus proche. Toutefois, la
spécification POSIX.1 de \fBmlock\fP() et de \fBmunlock\fP() permet à
l'implémentation d'imposer que \fIaddr\fP soit alignée sur une frontière de
page. Les applications portables devraient s'en assurer.
.PP
Le champ \fIVmLck\fP du fichier \fI/proc/PID/status\fP spécifique à Linux indique
combien de kilooctets de mémoire le processus d'identifiant \fIPID\fP a
verrouillé en utilisant \fBmlock\fP(), \fBmlock2\fP(), \fBmlockall\fP() et
\fBMAP_LOCKED\fP de \fBmmap\fP(2).
.SS "Limites et permissions"
Sous Linux 2.6.8 et précédents, un processus doit être privilégié
(\fBCAP_IPC_LOCK\fP) pour verrouiller de la mémoire et la limite souple
\fBRLIMIT_MEMLOCK\fP définit le nombre maximal d'octets que le processus peut
verrouiller en mémoire.
.PP
Depuis Linux 2.6.9, aucune limite n'est placée sur la quantité de mémoire
pouvant être verrouillée par un processus privilégié, et la limite souple
\fBRLIMIT_MEMLOCK\fP définit la quantité maximale de mémoire pouvant être
verrouillée par un processus non privilégié.
.SH BOGUES
.\" commit 0cf2f6f6dc605e587d2c1120f295934c77e810e8
Dans Linux 4.8 et antérieurs, un bogue dans le calcul par le noyau de la
mémoire verrouillée pour les processus non privilégiés (à savoir sans
\fBCAP_IPC_LOCK\fP) faisait que si la région indiquée par \fIaddr\fP et \fIlen\fP
incluait un verrou existant, les octets déjà verrouillés dans la région
incluante étaient comptés deux fois lors de la vérification de leur atteinte
de limite. Un tel double comptage calculerait mal une valeur de «\ mémoire
verrouillée totale\ » du processus qui a dépassé la limite \fBRLIMIT_MEMLOCK\fP,
si bien que \fBmlock\fP() et \fBmlock2\fP() échoueraient sur des requêtes qui
auraient dû réussir. Ce bogue a été corrigé dans Linux 4.9.
.PP
Dans les noyaux Linux de la branche 2.4 jusqu'à 2.4.17 inclus, le paramètre
\fBMCL_FUTURE\fP de \fBmlockall\fP() était hérité par l'enfant après un \fBfork\fP(2)
en raison d'un bogue. Cela a été corrigé dans le noyau 2.4.18.
.PP
.\" See the following LKML thread:
.\" http://marc.theaimsgroup.com/?l=linux-kernel&m=113801392825023&w=2
.\" "Rationale for RLIMIT_MEMLOCK"
.\" 23 Jan 2006
Depuis le noyau 2.6.9, si un processus privilégié appelle
\fImlockall(MCL_FUTURE)\fP et réduit ses privilèges plus tard (perd la capacité
\fBCAP_IPC_LOCK\fP, par exemple en prenant un UID effectif non nul), les
allocations de mémoires suivantes (p.ex. \fBmmap\fP(2), \fBbrk\fP(2)) échoueront
si la limite \fBRLIMIT_MEMLOCK\fP est dépassée.
.SH "VOIR AUSSI"
\fBmincore\fP(2), \fBmmap\fP(2), \fBsetrlimit\fP(2), \fBshmctl\fP(2), \fBsysconf\fP(3),
\fBproc\fP(5), \fBcapabilities\fP(7)
.SH COLOPHON
Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP
Linux. Une description du projet et des instructions pour signaler des
anomalies et la dernière version de cette page peuvent être trouvées à
l'adresse \%https://www.kernel.org/doc/man\-pages/.
.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 .