NOMBRE¶
mlockall - desactiva la paginación para el proceso invocador
SINOPSIS¶
#include <sys/mman.h>
int mlockall(int flags);
DESCRIPCIÓN¶
mlockall desactiva la paginación para todas las páginas
asociadas en el espacio de direcciones del proceso que hace la llamada. Esto
incluye las páginas del código, de los datos y del segmento de
pila, así como las bibliotecas compartidas, datos de núcleo en
espacio de usuario, memoria compartida y ficheros asociados a memoria. Se
garantiza que todas las páginas asociadas estarán en RAM cuando
la llamada al sistema
mlockall regrese con éxito, y se garantiza
que permanecerán en RAM hasta que las páginas se desbloqueen de
nuevo mediante
munlock o
munlockall o hasta que el proceso
termine o empiece otro programa debido a la llamada
exec. Los procesos
hijos no heredan bloqueos de página a través de un
fork.
El bloqueo de memoria tiene dos aplicaciones principales: algoritmos de tiempo
real y procesamiento de datos de alta seguridad. Las aplicaciones en tiempo
real requieren tiempos deterministas, y, como la planificación, la
paginación es una de las principales causas de retrasos inesperados en
la ejecución de programas. Las aplicaciones de tiempo real normalmente
también cambiarán a un planificador de tiempo real con
sched_setscheduler. Los programas de seguridad criptográficos a
menudo manejan bytes críticos como contraseñas o claves secretas
como estructuras de datos. Como resultado de la paginación, estos datos
secretos pueden transferirse a un medio de almacenamiento permanente como
resultado del trasiego (swap), donde podrían ser accesibles al enemigo
bastante tiempo después de que el programa de seguridad hubiera
terminado y borrado los datos secretos de la RAM. Para aplicaciones de
seguridad, sólo tienen que bloquearse partes pequeñas de la
memoria, para lo cual se dispone de
mlock.
El parámetro
flags puede construirse aplicando el operador
lógico de bits O (OR) a las siguientes constantes:
- MCL_CURRENT
- Bloquea todas las páginas que están asociadas actualmente en
el espacio de direcciones del proceso.
- MCL_FUTURE
- Bloquea todas las páginas que en el futuro se asociarán en
el espacio de direcciones del proceso. Éstas podrían ser,
por ejemplo, páginas nuevas requeridas por una pila y montón
crecientes así como nuevos ficheros asociados a memoria o regiones
de memoria compartida.
Si se ha especifiado
MCL_FUTURE y el número de páginas
bloqueadas excede el límite superior de las páginas bloqueadas
permitidas, entonces la llamada al sistema que haya causado la nueva
asociación fallará con
ENOMEM. Si estas nuevas
páginas han sido asociadas por la pila creciente, entonces el
núcleo denegará la expansión de la pila y mandará
una señal
SIGSEGV.
Los procesos en tiempo real deberían reservar bastantes páginas
bloqueadas antes de entrar en la sección crítica de tiempo, de
forma que ninguna llamada a función pueda provocar un fallo de
página. Esto puede lograrse llamando a una función que tenga una
variable automática suficientemente grande y que escriba en la memoria
ocupada por este vector grande, para tocar estas páginas de la pila. De
esta forma, se asociarán bastantes páginas para la pila y se
pueden bloquear en la RAM. Las escrituras falsas asegurarán que ni
siquiera ocurran fallos de página de copia-en-escritura en la
sección crítica.
Los bloqueos de memoria no se apilan; esto es, las páginas que hayan sido
bloqueadas varias veces mediante llamadas a
mlockall o a
mlock
se desbloquearán con una simple llamada a
munlockall. Las
páginas que estén asociadas a varias localizaciones o por varios
procesos permanecen bloqueadas en RAM mientras que estén bloqueadas al
menos en una localización o al menos por un proceso.
En sistemas POSIX en los cuales estén disponibles
mlockall y
munlockall, se define
_POSIX_MEMLOCK en <unistd.h>.
VALOR DEVUELTO¶
En caso de éxito,
mlockall devuelve cero. En caso de error, se
devuelve -1 y se pone un valor apropiado en
errno.
ERRORES¶
- ENOMEM
- El proceso intentó excederse en el número máximo de
páginas bloqueadas permitido.
- EPERM
- El proceso que hace la llamada no tiene los privilegios apropiados.
Sólo los procesos de root tienen permiso para bloquear
páginas.
- EINVAL
- Se han especificado flags desconocidos.
POSIX.1b, SVr4. SVr4 documenta un código de error adicional, EAGAIN.
VÉASE TAMBIÉN¶
munlockall(2),
mlock(2),
munlock(2)