Linux |
CentOS 4.8 |
|
mlockall(2) |
mlockall − Désactiver la pagination pour le processus appelant. |
#include <sys/mman.h> int mlockall(int flags); |
mlockall désactive la pagination (paging) pour toutes les pages représentées dans l’espace d’adressage du processus appelant. Ceci inclut les pages de code, de données, et le segment de pile, tout autant que les bibliothèques partagées, l’espace utilisateur dans le noyau, la mémoire partagée et les fichiers projetés en mémoire. Quand l’appel système 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 comportement d’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> |
mlockall renvoie 0 si il réussit, ou −1 s’il échoue, auquel cas errno contient le code d’erreur. |
ENOMEM |
Le processus a dépassé le nombre maximal de page verrouillées. |
||
EPERM |
L’appelant n’a pas les privilèges appropriés, seul le Super−User peut verrouiller des pages. |
||
EINVAL |
Un attribut inconnu a été spécifié. |
POSIX.1b, SVr4. SVr4 documente un code d’erreur EAGAIN supplémentaire. |
munlockall(2), mlock(2), munlock(2) |
Christophe Blaess, 1997. |
mlockall(2) |