mmap

MMAP(2)                 Manual del Programador de Linux                MMAP(2)



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 lÃÂmites 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.



Linux 2.3.51                     25 marzo 2000                         MMAP(2)