mlockall - Désactiver la pagination pour le processus appelant.
mlockall
désactive la pagination pour toutes les pages présentes dans l'espace d'adressage
du processus appelant. Ceci inclut les pages de code, de données, et la pile,
tout autant 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. Quand l'appel
mlockall
réussit, on a l'assurance que toutes les pages concernées résident en mémoire
vive (RAM) et y resteront jusqu'à un déverrouillage par la fonction
munlock
ou
munlockall
ou encore jusqu'à ce que le processus se termine ou démarre
un programme avec
exec.
Les processus fils n'héritent pas du verrouillage des pages
à travers un
fork.
Il y a deux domaines principaux d'applications au 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.
Les logiciels de cryptographie manipulent souvent quelques
octets hautement confidentiels, comme des mots de passe ou
des clés privées. A 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é.
Néanmoins pour les applications sécurisées, seule une petite
partie de la mémoire doit être verrouillée, pour laquelle la
fonction
mlock
est parfaitement appropriée.
Le paramètre
flags
est constitué par un
OU binaire
( | ) entre les constantes symboliques suivantes :
- MCL_CURRENT
-
Verrouiller toutes les pages correspondant actuellement à l'espace
d'adressage du processus.
- MCL_FUTUR
-
Verrouiller toutes les pages qui seront dans l'espace d'adressage
du processus dans le futur. Ceci concerne par exemple les nouvelles
pages réclamées par un agrandissement de la pile ou du tas, autant
que les nouveaux fichier projetés en mémoire, ou les nouvelles
régions de mémoire partagée.
Si
MCL_FUTUR
a été réclamé, et que le nombre de pages verrouillées
excède la limite maximale, l'appel système ayant entraîné le
dépassement échouera avec une erreur
ENOMEM.
Si le problème se pose à cause de l'expansion de la pile, le noyau
empêchera l'agrandissement de celle-ci et déclenchera un signal
SIGSEGV.
Les processus temps-réel doivent réserver suffisamment de pages
avant d'entrer dans des portions critiques, pour éviter tout
déclenchement de faute de page.
Ceci peut être effectué simplement en appelant une fonction
réclamant une variable automatique suffisamment grande, et qui
écrit dans cette variable de manière à allouer ces pages pour
la pile.
L'écriture dans la variable garantit qu'il ne se produira même pas
de faute de page de copie-sur-écriture durant l'exécution de la
section critique.
Il n'y a pas d'empilement des verrouillages mémoire, ce qui
signifie qu'une page verrouillée plusieurs fois par
mlock
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 verrouillées par plusieurs zones, ou
par plusieurs processus restent en mémoire vive tant qu'il
y a au moins un processus ou une zone qui les verrouille.
Sur les systèmes POSIX où
mlockall
et
munlockall
sont disponibles, la constante symbolique
_POSIX_MEMLOCK
est définie dans <
unistd.h>
POSIX.1b, SVr4. SVr4 documente un code d'erreur EAGAIN supplémentaire.
Christophe Blaess, 1996-2003.