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.