Provided by:
manpages-es_1.55-9_all 
NOMBRE
mmap, munmap - ubica o elimina ficheros o dispositivos en memoria
SINOPSIS
#include <sys/mman.h>
caddr_t mmap(void *start, size_t length, int prot , int flags, int fd,
off_t offset);
int munmap(void *start, size_t length);
DESCRIPCIÓN
La función mmap intenta ubicar length bytes comenzando en el
desplazamiento offset desde el fichero (u otro objeto) especificado por
el descriptor de fichero fd en memoria, preferiblemente en la dirección
start. Esta última dirección es una sugerencia y normalmente se
especifica como 0. El lugar donde es ubicado el objeto es devuelto por
mmap, y nunca vale 0. El argumento prot describe la protección de
memoria deseada. (y no debe entrar en conflicto con el modo de apertura
del fichero). Puede valer PROT_NONE o ser la combinación mediante la
operación OR de una o más de las otras banderas PROT_*.
PROT_EXEC Las páginas deben ser ejecutadas.
PROT_READ Las páginas deben ser leídas.
PROT_WRITE Las páginas deben ser escritas.
PROT_NONE Las páginas no pueden ser accedidas.
El parámetro flags especifica el tipo de objeto insertado, las opciones
de asociación y si las modificaciones hechas a la copia insertada en
memoria son privadas al proceso o son compartidas por otras
referencias. Tiene los bits:
MAP_FIXED No seleccionar una dirección diferente a la especificada.
Si la dirección especificada no puede ser utilizada, mmap
fallará. Si MAP_FIXED es especificado, start debe ser un
múltiplo del tamaño de página. Utilizar esta opción es
desaconsejable.
MAP_SHARED Comparte este área con todos los otros objetos que señalan a
este objeto. Almacenar en la región es equivalente a
escribir en el fichero. El fichero puede no actualizarse
hasta que se llame a msync(2) o munmap(2).
MAP_PRIVATE
Crear un área privada "copy-on-write". Almacenar en la
región no afecta al fichero original. Es indefinido si los
cambios hechos al fichero después de la llamada a mmap son
visibles en la región mapeada.
Debe especificarse exactamente uno de los parámetros MAP_SHARED o
MAP_PRIVATE.
Los tres parámetros anteriores están descritos en POSIX.1b (formalmente
POSIX.4) y Linux también reconoce los siguientes parámetros no
estándares:
MAP_DENYWRITE
Este parámetro es ignorado. (Anteriormente, indicaba que los
intentos de escritura al fichero subyacente deberían fallar con
ETXTBUSY. Pero ésto era fuente de ataques de denegación -de-
servicio.)
MAP_EXECUTABLE
Este parámetro es ignorado.
MAP_NORESERVE
(Usado junto con MAP_PRIVATE.) No reserva páginas del espacio de
intercambio para esta correspondencia. Cuando se reserva espacio
de intercambio, se tiene la garantía de que es posible modificar
esta región privada. Cuando no se reserva puede obtenerse una
violación de segmento al escribir si no hay memoria disponible.
MAP_LOCKED
Este parámetro es ignorado.
MAP_GROWSDOWN
Usado para pilas. Indica al sistema VM del núcleo que la
correspondencia podría extenderse hacia abajo en memoria.
MAP_ANONYMOUS
La correspondencia no está respaldada por ningún fichero; los
argumentos fd y offset son ignorados. Este parámetro
conjuntamente con MAP_SHARED está implementado desde Linux 2.4.
MAP_ANON
Sinónimo para MAP_ANONYMOUS. Desaconsejado.
MAP_FILE
Parámetro de compatibilidad. Ignorado.
MAP_32BIT
Ubica la correspondencia dentro de los primeros 2 GB del espacio
de direcciones del proceso. Es ignorado cuando MAP_FIXED está
activo. Este parámetro está soportado actualmente sólo sobre
x86-64 para programas de 64 bits.
Algunos sistemas documentan los parámetros adicionales MAP_AUTOGROW,
MAP_AUTORESRV, MAP_COPY, y MAP_LOCAL.
fd debe ser un descriptor de fichero válido, a menos que MAP_ANONYMOUS
esté activo, en cuyo caso el argumento es ignorado.
offset debe ser un múltiplo del tamaño de página como lo devuelve
getpagesize(2).
La memoria asociada con mmap es conservada después de fork(2), con los
mismos atributos.
Un fichero es ubicado en múltiplos del tamaño de página. Para un
fichero que no sea múltiplo del tamaño de página, la memoria restante
es puesta a cero cuando se ubica, y las escrituras a esa región no son
llevadas al fichero. El efecto de cambiar el tamaño del fichero
subyacente a una correspondencia en aquellas páginas que correspondan a
regiones añadidas o eliminadas del fichero es indefinido.
La llamada al sistema munmap borra las ubicaciones para el rango de
direcciones especificado, y produce referencias a las direcciones
dentro del rango a fin de generar referencias a memoria inválidas. La
región es también desubicada automáticamente cuando el proceso termina.
Por otra parte, cerrar el descriptor de fichero no desubica la región.
La dirección start debe ser un múltiplo del tamaño de página. Todas las
páginas que contengan una parte del rango indicado son desubicadas, y
referencias posteriores a estas páginas generarán una violación de
segmento. No se considera un error si el rango indicado no contiene
páginas con correspondencia.
Para correspondencias respaldadas por fichero, el campo st_atime para
el fichero ubicado puede ser actualizado en cualquier instante entre la
llamada mmap() y la desubicación correspondiente; la primera referencia
a una página con correspondencia actualizará el campo si no lo ha sido
ya.
Los campos st_ctime y st_mtime para un fichero ubicado con PROT_WRITE y
MAP_SHARED serán actualizados después de una escritura a la región
ubicada, y antes de una llamada posterior a msync() con la opción
MS_SYNC o MS_ASYNC, si alguna procede.
VALOR DEVUELTO
Si ha funcionado mmap devuelve un puntero al área reservada. En caso
de error, es devuelto -1, y errno es modificado apropiadamente. Si ha
funcionado munmap devuelve 0, si hay error -1, y errno es fijada
(probablemente a EINVAL).
OBSERVACIONES
Es dependiente de la arquitectura si PROT_READ incluye a PROT_EXEC o
no. Los programas portables deberían siempre activar PROT_EXEC si
intentan ejecutar código en la nueva región ubicada.
ERRORES
EBADF fd no es un descriptor de fichero válido (y MAP_ANONYMOUS no ha
sido fijado).
EACCES Un descriptor de fichero hace referencia a un fichero no
regular. O bien se solicitó MAP_PRIVATE, pero fd no está
abierto para lectura. O bien se solicitó MAP_SHARED y
PROT_WRITE está activo, pero fd no está abierto en modo
lectura/escritura (O_RDWR). O bien PROT_WRITE está activo, pero
el fichero es sólo para añadir.
EINVAL No es correcto start o length o offset. (E.g., son demasiado
grandes, o no están alineados en los limites de un valor
múltiplo de PAGESIZE).
ETXTBSY
MAP_DENYWRITE fue fijado pero el objeto especificado por fd está
abierto para escritura.
EAGAIN El fichero ha sido bloqueado, o se ha bloqueado una cantidad
excesiva de memoria.
ENOMEM No hay memoria disponible, o el número máximo de
correspondencias del proceso habría sido excedido.
ENODEV El sistema de ficheros subyacente del fichero especificado no
soporta la correspondencia de memoria.
El uso de una región ubicada puede resultar en estas señales:
SIGSEGV
Intento de escritura en una región especificada a mmap como
solo-lectura.
SIGBUS Intento de acceso a una porción del buffer que no se corresponde
con el fichero (por ejemplo, más allá del fin del fichero,
incluyendo el caso en el que otro proceso ha truncado el
fichero).
CONFORME A
SVr4, POSIX.1b (formalmente POSIX.4), 4.4BSD, SUSv2. SVr4 documenta
los códigos de error ENXIO y ENODEV. SUSv2 documenta ls códigos de
error adicionales EMFILE y EOVERFLOW.
MAP_32BIT es una extensión de Linux.
VÉASE TAMBIÉN
getpagesize(2), mmap2(2), mremap(2), msync(2), shm_open(2), B.O.
Gallmeister, POSIX.4, O'Reilly, pp. 128-129 and 389-391.