Provided by: manpages-es_1.55-7_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 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.