Provided by: manpages-es_1.55-10_all bug

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.