Man page - mlock(2)

Packages contains this manual

Available languages:

en fr ja ru de

Manual

mlock

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
mlock(), mlock2() et munlock()
mlockall() et munlockall()
VALEUR RENVOYÉE
ERREURS
VERSIONS
Linux
STANDARDS
HISTORIQUE
NOTES
Limites et permissions
BOGUES
VOIR AUSSI
TRADUCTION

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