NOMBRE¶
mlock - desactiva la paginación para algunas zonas de memoria
SINOPSIS¶
#include <sys/mman.h>
int mlock(const void *addr, size_t len);
DESCRIPCIÓN¶
mlock desactiva la paginación para la memoria en el grupo de
direcciones que comienza en la dirección
addr con longitud
len bytes. Se garantiza que todas las páginas que contienen
algunas de esas direcciones estarán residentes en RAM cuando la llamada
al sistema
mlock termine sin error y permanecerán en RAM hasta que
dichas páginas sean desbloquedadas con
munlock o
munlockall, hasta que las páginas sean desalojadas vía
munmap, o hasta que termine el proceso o comience otro programa con
exec. Los procesos hijos creados mediante
fork no heredan los
bloqueos de páginas.
El bloqueo de memoria tiene dos aplicaciones fundamentales: algoritmos en tiempo
real y procesado de datos de alta seguridad. Las aplicaciones en tiempo real
requieren una temporización determinista, y la paginación es una de
las causas principales de retardos inesperados en la ejecución de
programas, junto con la planificación (scheduling). Las aplicaciones en
tiempo real suelen conmutar a un planificador en tiempo real con
sched_setscheduler. El software de seguridad criptográfico a
menudo trabaja con bytes críticos tales como contraseñas o claves
secretas. Como resultado de la paginación, estos secretos pueden ser
transferidos a un medio de almacenamiento de intercambio persistente, donde
podría ser leído por el enemigo mucho después de que el
programa de seguridad haya borrado los secretos de la RAM y terminado.
Los bloqueos de memoria no son acumulativos, es decir, si una página ha
sido bloqueda varias veces mediante llamadas a
mlock o
mlockall
será desbloqueada con una simple llamada a
munlock para el rango
correspondiente o con
munlockall. Las páginas que son asociadas a
varias zonas o a varios procesos permanecen bloqueadas en RAM mientras lo
estén por alguna zona o proceso.
En los sistemas POSIX con
mlock y
munlock disponibles, se define
_POSIX_MEMLOCK_RANGE en <unistd.h> y el valor de
PAGESIZE
de <limits.h> indica el número de bytes por página.
OBSERVACIONES¶
Con la llamada al sistema de Linux,
addr se redondea hacia abajo
automáticamente hacia el límite de página más cercano. Sin
embargo, POSIX 1003.1-2001 permite una implementación que requiere que
addr esté en situado un límite de página, por lo que las
aplicaciones deberían asegurar este requisito.
VALOR DEVUELTO¶
En caso de éxito,
mlock devuelve cero. Si hay error, se devuelve -1,
errno se activa convenientemente y no se realiza ningún cambio en
ningún bloqueo en el espacio de direcciones del proceso.
ERRORES¶
- ENOMEM
- Alguna parte del rango de direcciones no corresponde a
páginas asociadas en el espacio de direcciones del proceso o el
proceso intentó exceder el número máximo de páginas
bloqueadas permitido.
- EPERM
- El proceso invocador no tiene los privilegios necesarios.
Sólo se permite bloquear páginas a los procesos del
superusuario.
- EINVAL
- len no era un número positivo.
POSIX.1b, SVr4. SVr4 añade un código de error adicional (EAGAIN).
VÉASE TAMBIÉN¶
mlockall(2),
munlock(2),
munlockall(2),
munmap(2),
setrlimit(2)