plucky (2) mlock.2.gz

Provided by: manpages-fr-dev_4.25.1-1_all bug

NOM

       mlock, mlock2, munlock, mlockall, munlockall - Verrouiller et déverrouiller la mémoire

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <sys/mman.h>

       int mlock(const void addr[.len], size_t len);
       int mlock2(const void addr[.len], size_t len, unsigned int flags);
       int munlock(const void addr[.len], size_t len);

       int mlockall(int flags);
       int munlockall(void);

DESCRIPTION

       mlock(), mlock2() et mlockall() 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).

       munlock() et munlockall() 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.

       Le verrouillage et le déverrouillage de la mémoire s'effectuent sur des unités de page entière.

   mlock(), mlock2() et munlock()
       mlock() verrouille les pages sur len octets à partir de l'adresse addr. 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.

       mlock() verrouille aussi les pages de la plage indiquée sur  len  octets  à  partir  de  l'adresse  addr.
       Néanmoins,  l'état  des  pages  contenues dans cette plage après un appel réussi dépendra de la valeur du
       paramètre flags.

       L'argument flags peut être 0 ou la constante suivante :

       MLOCK_ONFAULT
              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.

       Si flags vaut 0, mlock2() se comporte exactement comme mlock().

       munlock()  déverrouille la mémoire sur len octets à partir de l'adresse addr. 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.

   mlockall() et munlockall()
       mlockall()  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.

       L'argument flags est composé d'un OU binaire avec les options suivantes :

       MCL_CURRENT
              Verrouiller toutes les pages actuellement projetées dans l'espace d'adressage du processus.

       MCL_FUTURE
              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.

       MCL_ONFAULT (depuis Linux 4.4)
              Utilisé  avec  MCL_CURRENT, MCL_FUTURE ou les deux. Marquer toutes les projections actuelles (avec
              MCL_CURRENT) ou futures (avec MCL_FUTURE) pour verrouiller les pages quand elles  contiennent  des
              erreurs.  Si  on  l'utilise  avec  MCL_CURRENT,  toutes les pages présentes sont verrouillées mais
              mlockall() ne rencontrera pas d'erreur sur des  pages  non  présentes.  Quand  on  l'utilise  avec
              MCL_FUTURE,  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. MCL_ONFAULT doit être utilisé avec MCL_CURRENT, MCL_FUTURE ou les deux.

       Si  MCL_FUTURE  a  été  utilisé,  un  appel  système ultérieur (p.ex. mmap(2), sbrk(2), malloc(3)) risque
       d'échouer s'il cause un dépassement du nombre d'octets verrouillés autorisé (voir ci‐dessous).  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 SIGSEGV au processus.

       munlockall() déverrouille toutes les pages projetées dans l'espace d'adressage du processus appelant.

VALEUR RENVOYÉE

       S'ils réussissent, ces appels système  renvoient  0.  En  cas  d'erreur,  ils  renvoient  -1,  errno  est
       positionné  pour  indiquer l'erreur et les verrouillages de l'espace d'adressage du processus ne sont pas
       modifiés.

ERREURS

       EAGAIN (mlock(), mlock2() et munlock()) Une partie (ou l'ensemble) de l'espace  d'adressage  indiqué  n'a
              pas pu être verrouillée.

       EINVAL (mlock(),  mlock2()  et munlock()) La somme de addr+len était inférieure à addr (l'addition aurait
              pu conduire à un dépassement par exemple).

       EINVAL (mlock2()) Des flags inconnus étaient demandés.

       EINVAL (mlockall()) Des flags inconnus ont été indiqués ou MCL_ONFAULT a été indiqué sans  MCL_FUTURE  ou
              MCL_CURRENT.

       EINVAL (Pas sous Linux) addr n'est pas un multiple de la taille de la page.

       ENOMEM (mlock(),  mlock2()  et  munlock())  Une  partie de la zone indiquée ne correspond pas à des pages
              projetées dans l'espace d'adressage du processus.

       ENOMEM (mlock(), mlock2() et munlock()) 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.

       ENOMEM (Linux 2.6.9 et plus récents) L'appelant avait une limite souple RLIMIT_MEMLOCK 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é (CAP_IPC_LOCK).

       ENOMEM (Linux 2.4 et précédents) Le processus appelant a essayé de verrouiller plus de la  moitié  de  la
              mémoire vive.

       EPERM  L'appelant  n'est  pas  privilégié  mais  a  besoin  de  droits  (CAP_IPC_LOCK)  pour réaliser les
              opérations demandées.

       EPERM  (munlockall()) (Linux 2.6.8 et précédents) L'appelant n'est pas privilégié (CAP_IPC_LOCK).

VERSIONS

   Linux
       Sous Linux, mlock(), mlock2() et munlock() arrondissent automatiquement addr à la frontière  de  page  la
       plus  proche.  Toutefois,  la  spécification POSIX.1 de mlock() et de munlock() permet à l'implémentation
       d'imposer que addr soit alignée sur une frontière de page.  Les  applications  portables  devraient  s'en
       assurer.

       Le  champ VmLck du fichier /proc/pid/status spécifique à Linux indique le nombre de kilooctets de mémoire
       que le processus d'identifiant PID a verrouillé en utilisant mlock(), mlock2(), mlockall() et  MAP_LOCKED
       de mmap(2).

STANDARDS

       mlock()
       munlock()
       mlockall()
       munlockall()
              POSIX.1-2008.

       mlock2()
              Linux.

       Sur   les   systèmes   POSIX   où   mlock()  et  munlock()  sont  disponibles,  la  constante  symbolique
       _POSIX_MEMLOCK_RANGE est définie dans <unistd.h> et le nombre d'octets par page peut être déterminé grâce
       à la constante PAGESIZE si définie dans <limits.h> ou en appelant sysconf(_SC_PAGESIZE).

       Sur  les systèmes POSIX sur lesquels mlockall() et munlockall() sont disponibles, la constante symbolique
       _POSIX_MEMLOCK est définie dans <unistd.h> comme étant  une  valeur  supérieure  à  0.  (Consultez  aussi
       sysconf(3).)

HISTORIQUE

       mlock()
       munlock()
       mlockall()
       munlockall()
              POSIX.1-2001, POSIX.1-2008, SVr4.

       mlock2()
              Linux 4.4, glibc 2.27.

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‐réel avec sched_setscheduler(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.

       Les processus temps‐réel utilisant mlockall() 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.

       Les  verrouillages  de  mémoire  ne  sont  pas  récupérés  par  un  enfant  lors  d'un  fork(2)  et  sont
       automatiquement supprimés (déverrouillés) au cours d'un execve(2) ou lorsque le processus se termine. Les
       paramètres  MCL_FUTURE et MCL_FUTURE | MCL_ONFAULT de mlockall() ne sont pas récupérés par un enfant créé
       par fork(2) et sont effacés au cours d'un execve(2).

       Remarquez que fork(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 fork(2) après
       des  opérations  mlockall()  ou  mlock() ; même à partir d'un thread qui tourne en priorité basse dans un
       processus dont un thread tourne en priorité haute.

       Le verrouillage de mémoire sur une  zone  est  automatiquement  enlevé  si  la  zone  est  invalidée  par
       munmap(2).

       Il  n'y  a  pas d'empilement des verrouillages mémoire, ce qui signifie qu'une page verrouillée plusieurs
       fois par des appels mlock(), mlock2() ou mlockall() sera libérée en un seul appel  à  munlock()  pour  la
       zone  mémoire  correspondante  ou  par  un appel à munlockall(). 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.

       Si un appel à mlockall(), qui utilise l'attribut MCL_FUTURE, est suivi d'un autre appel qui n'indique pas
       cet attribut, les changements effectués par l'appel MCL_FUTURE seront perdus.

       L'attribut MLOCK_ONFAULT de mlock2() et  celui  MCL_ONFAULT  de  mlockall()  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.

   Limites et permissions
       Sous  Linux  2.6.8 et précédents, un processus doit être privilégié (CAP_IPC_LOCK) pour verrouiller de la
       mémoire et la limite souple RLIMIT_MEMLOCK définit le nombre  maximal  d'octets  que  le  processus  peut
       verrouiller en mémoire.

       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 RLIMIT_MEMLOCK définit la quantité maximale de mémoire  pouvant
       être verrouillée par un processus non privilégié.

BOGUES

       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 CAP_IPC_LOCK) faisait que si la région indiquée par addr et  len
       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 RLIMIT_MEMLOCK, si bien que
       mlock()  et mlock2() échoueraient sur des requêtes qui auraient dû réussir. Ce bogue a été  corrigé  dans
       Linux 4.9.

       Dans  Linux  de  la  branche 2.4  des  noyaux,  jusqu'à  Linux 2.4.17  inclus, le paramètre MCL_FUTURE de
       mlockall() était hérité par l'enfant après un fork(2) en raison d'un  bogue.  Cela  a  été  corrigé  dans
       Linux 2.4.18.

       Depuis Linux 2.6.9, si un processus privilégié appelle mlockall(MCL_FUTURE) et réduit ses privilèges plus
       tard (perd la capacité CAP_IPC_LOCK, par exemple en prenant un UID effectif non nul), les allocations  de
       mémoires suivantes (p.ex. mmap(2), brk(2)) échoueront si la limite RLIMIT_MEMLOCK est dépassée.

VOIR AUSSI

       mincore(2), mmap(2), setrlimit(2), shmctl(2), sysconf(3), proc(5), capabilities(7)

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   ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   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⟩.