MMAP(2)

NOMBRE
mmap, munmap - ubica o elimina ficheros o dispositivos en memoria

SINOPSIS
#include <unistd.h>
#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) espeficicado por 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. El argumento prot describe la protección de memoria deseada. Lo forman los siguientes bits:

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.

MAP_PRIVATE
    Crear un área privada "copy-on-write".

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). Linux también reconoce MAP_DENYWRITE, MAP_EXECUTABLE y MAP_ANON(YMOUS). 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.

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).

ERRORES

EBADF
    fd no es un descriptor de fichero válido (y MAP_ANONYMOUS no ha sido fijado).

EACCES
    MAP_PRIVATE fue indicado, pero fd no ha sido abierto para lectura. O MAP_SHARED fue invocado y PROT_WRITE fue fijado, y fd no está abierto para escritura.

EINVAL
    No es correcto start o length o offset. (E.g., son demasiado grandes, o no están alineados en los límites de un valor múltiplo de PAGESIZE).

ETXTBUSY
    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.

CONFORME A
SVr4, POSIX.1b (formalmente POSIX.4), 4.4BSD. Svr4 documenta los códigos de error ENXIO y ENODEV.

VÉASE TAMBIÉN
getpagesize(2), msync(2), shm_open(2), B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128-129 and 389-391.