Provided by:
manpages-es_1.55-10_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'ON
La funcion 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 direccion
start. Esta ultima direccion 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 proteccion de
memoria deseada. (y no debe entrar en conflicto con el modo de apertura
del fichero). Puede valer PROT_NONE o ser la combinacion mediante la
operacion OR de una o mas de las otras banderas PROT_*.
PROT_EXEC Las paginas deben ser ejecutadas.
PROT_READ Las paginas deben ser leidas.
PROT_WRITE Las paginas deben ser escritas.
PROT_NONE Las paginas no pueden ser accedidas.
El parametro flags especifica el tipo de objeto insertado, las opciones
de asociacion 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 direccion diferente a la especificada.
Si la direccion especificada no puede ser utilizada, mmap
fallara. Si MAP_FIXED es especificado, start debe ser un
multiplo del tamano de pagina. Utilizar esta opcion es
desaconsejable.
MAP_SHARED Comparte este area con todos los otros objetos que senalan a
este objeto. Almacenar en la region 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 area privada "copy-on-write". Almacenar en la
region no afecta al fichero original. Es indefinido si los
cambios hechos al fichero despues de la llamada a mmap son
visibles en la region mapeada.
Debe especificarse exactamente uno de los parAimetros MAP_SHARED o
MAP_PRIVATE.
Los tres parametros anteriores estan descritos en POSIX.1b (formalmente
POSIX.4) y Linux tambien reconoce los siguientes parametros no
estandares:
MAP_DENYWRITE
Este parametro es ignorado. (Anteriormente, indicaba que los
intentos de escritura al fichero subyacente deberian fallar con
ETXTBUSY. Pero esto era fuente de ataques de denegacion -de-
servicio.)
MAP_EXECUTABLE
Este parametro es ignorado.
MAP_NORESERVE
(Usado junto con MAP_PRIVATE.) No reserva paginas del espacio de
intercambio para esta correspondencia. Cuando se reserva espacio
de intercambio, se tiene la garantia de que es posible modificar
esta region privada. Cuando no se reserva puede obtenerse una
violacion de segmento al escribir si no hay memoria disponible.
MAP_LOCKED
Este parametro es ignorado.
MAP_GROWSDOWN
Usado para pilas. Indica al sistema VM del nucleo que la
correspondencia podria extenderse hacia abajo en memoria.
MAP_ANONYMOUS
La correspondencia no esta respaldada por ningun fichero; los
argumentos fd y offset son ignorados. Este parametro
conjuntamente con MAP_SHARED esta implementado desde Linux 2.4.
MAP_ANON
Sinonimo para MAP_ANONYMOUS. Desaconsejado.
MAP_FILE
Parametro 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 esta
activo. Este parametro esta soportado actualmente solo sobre
x86-64 para programas de 64 bits.
Algunos sistemas documentan los parametros adicionales MAP_AUTOGROW,
MAP_AUTORESRV, MAP_COPY, y MAP_LOCAL.
fd debe ser un descriptor de fichero valido, a menos que MAP_ANONYMOUS
este activo, en cuyo caso el argumento es ignorado.
offset debe ser un multiplo del tamano de pagina como lo devuelve
getpagesize(2).
La memoria asociada con mmap es conservada despues de fork(2), con los
mismos atributos.
Un fichero es ubicado en multiplos del tamano de pagina. Para un
fichero que no sea multiplo del tamano de pagina, la memoria restante
es puesta a cero cuando se ubica, y las escrituras a esa region no son
llevadas al fichero. El efecto de cambiar el tamano del fichero
subyacente a una correspondencia en aquellas paginas que correspondan a
regiones anadidas 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 invalidas. La
region es tambien desubicada automaticamente cuando el proceso termina.
Por otra parte, cerrar el descriptor de fichero no desubica la region.
La direccion start debe ser un multiplo del tamano de pagina. Todas las
paginas que contengan una parte del rango indicado son desubicadas, y
referencias posteriores a estas paginas generaran una violacion de
segmento. No se considera un error si el rango indicado no contiene
paginas 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 desubicacion correspondiente; la primera referencia
a una pagina con correspondencia actualizara 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 seran actualizados despues de una escritura a la region
ubicada, y antes de una llamada posterior a msync() con la opcion
MS_SYNC o MS_ASYNC, si alguna procede.
VALOR DEVUELTO
Si ha funcionado mmap devuelve un puntero al area 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 deberian siempre activar PROT_EXEC si
intentan ejecutar codigo en la nueva region ubicada.
ERRORES
EBADF fd no es un descriptor de fichero valido (y MAP_ANONYMOUS no ha
sido fijado).
EACCES Un descriptor de fichero hace referencia a un fichero no
regular. O bien se solicito MAP_PRIVATE, pero fd no esta
abierto para lectura. O bien se solicito MAP_SHARED y
PROT_WRITE esta activo, pero fd no esta abierto en modo
lectura/escritura (O_RDWR). O bien PROT_WRITE esta activo, pero
el fichero es solo para anadir.
EINVAL No es correcto start o length o offset. (E.g., son demasiado
grandes, o no estan alineados en los limites de un valor
multiplo de PAGESIZE).
ETXTBSY
MAP_DENYWRITE fue fijado pero el objeto especificado por fd esta
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 numero maximo de
correspondencias del proceso habria sido excedido.
ENODEV El sistema de ficheros subyacente del fichero especificado no
soporta la correspondencia de memoria.
El uso de una region ubicada puede resultar en estas senales:
SIGSEGV
Intento de escritura en una region especificada a mmap como
solo-lectura.
SIGBUS Intento de acceso a una porcion del buffer que no se corresponde
con el fichero (por ejemplo, mas alla 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 codigos de error ENXIO y ENODEV. SUSv2 documenta ls codigos de
error adicionales EMFILE y EOVERFLOW.
MAP_32BIT es una extension de Linux.
V'EASE TAMBI'EN
getpagesize(2), mmap2(2), mremap(2), msync(2), shm_open(2), B.O.
Gallmeister, POSIX.4, O'Reilly, pp. 128-129 and 389-391.