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.

Linux 2.3.51                                      25 marzo 2000                                          MMAP(2)