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'ON

       La  funcion  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 direccion
       start.   Esta  ultima  direccion  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 proteccion de
       memoria deseada. (y no debe entrar en conflicto con el modo de apertura
       del  fichero).  Puede  valer PROT_NONE o ser la combinacion mediante la
       operacion OR de una o mas de las otras banderas PROT_*.

       PROT_EXEC  Las paginas deben ser ejecutadas.

       PROT_READ  Las paginas deben ser leidas.

       PROT_WRITE Las paginas deben ser escritas.

       PROT_NONE  Las paginas no pueden ser accedidas.

       El parametro flags especifica el tipo de objeto insertado, las opciones
       de  asociacion  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  direccion diferente a la especificada.
                  Si la direccion especificada no puede  ser  utilizada,  mmap
                  fallara.  Si  MAP_FIXED  es  especificado, start debe ser un
                  multiplo del tamano  de  pagina.  Utilizar  esta  opcion  es
                  desaconsejable.

       MAP_SHARED Comparte este area con todos los otros objetos que senalan a
                  este objeto.   Almacenar  en  la  region  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 area  privada  "copy-on-write".   Almacenar  en  la
                  region  no afecta al fichero original.  Es indefinido si los
                  cambios hechos al fichero despues de la llamada a  mmap  son
                  visibles en la region mapeada.

       Debe  especificarse  exactamente  uno  de  los parAimetros MAP_SHARED o
       MAP_PRIVATE.

       Los tres parametros anteriores estan descritos en POSIX.1b (formalmente
       POSIX.4)   y  Linux  tambien  reconoce  los  siguientes  parametros  no
       estandares:

       MAP_DENYWRITE
              Este parametro es ignorado.  (Anteriormente,  indicaba  que  los
              intentos  de escritura al fichero subyacente deberian fallar con
              ETXTBUSY. Pero esto era fuente de  ataques  de  denegacion  -de-
              servicio.)

       MAP_EXECUTABLE
              Este parametro es ignorado.

       MAP_NORESERVE
              (Usado junto con MAP_PRIVATE.) No reserva paginas del espacio de
              intercambio para esta correspondencia. Cuando se reserva espacio
              de intercambio, se tiene la garantia de que es posible modificar
              esta region privada.  Cuando no se reserva puede  obtenerse  una
              violacion de segmento al escribir si no hay memoria disponible.

       MAP_LOCKED
              Este parametro es ignorado.

       MAP_GROWSDOWN
              Usado  para  pilas.  Indica  al  sistema  VM  del  nucleo que la
              correspondencia podria extenderse hacia abajo en memoria.

       MAP_ANONYMOUS
              La correspondencia no esta respaldada por  ningun  fichero;  los
              argumentos   fd   y   offset   son   ignorados.  Este  parametro
              conjuntamente con MAP_SHARED esta implementado desde Linux 2.4.

       MAP_ANON
              Sinonimo para MAP_ANONYMOUS. Desaconsejado.

       MAP_FILE
              Parametro 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 esta
              activo. Este parametro esta  soportado  actualmente  solo  sobre
              x86-64 para programas de 64 bits.

       Algunos  sistemas  documentan  los parametros adicionales MAP_AUTOGROW,
       MAP_AUTORESRV, MAP_COPY, y MAP_LOCAL.

       fd debe ser un descriptor de fichero valido, a menos que  MAP_ANONYMOUS
       este activo, en cuyo caso el argumento es ignorado.

       offset  debe  ser  un  multiplo  del  tamano de pagina como lo devuelve
       getpagesize(2).

       La memoria asociada con mmap es conservada  despues de fork(2), con los
       mismos atributos.

       Un  fichero  es  ubicado  en  multiplos  del  tamano de pagina. Para un
       fichero que no sea multiplo del tamano de pagina, la  memoria  restante
       es  puesta a cero cuando se ubica, y las escrituras a esa region no son
       llevadas al fichero.  El  efecto  de  cambiar  el  tamano  del  fichero
       subyacente a una correspondencia en aquellas paginas que correspondan a
       regiones anadidas 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 invalidas.   La
       region es tambien desubicada automaticamente cuando el proceso termina.
       Por otra parte, cerrar el descriptor de fichero no desubica la region.

       La direccion start debe ser un multiplo del tamano de pagina. Todas las
       paginas  que  contengan una parte del rango indicado son desubicadas, y
       referencias posteriores a estas  paginas  generaran  una  violacion  de
       segmento.  No  se  considera  un error si el rango indicado no contiene
       paginas 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 desubicacion correspondiente; la primera referencia
       a  una pagina con correspondencia actualizara 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  seran  actualizados  despues  de  una escritura a la region
       ubicada, y antes de una llamada  posterior  a  msync()  con  la  opcion
       MS_SYNC o MS_ASYNC, si alguna procede.

VALOR DEVUELTO

       Si  ha  funcionado mmap devuelve un puntero al area 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  deberian  siempre  activar PROT_EXEC si
       intentan ejecutar codigo en la nueva region ubicada.

ERRORES

       EBADF  fd no es un descriptor de fichero valido (y MAP_ANONYMOUS no  ha
              sido fijado).

       EACCES Un  descriptor  de  fichero  hace  referencia  a  un  fichero no
              regular.  O bien  se  solicito  MAP_PRIVATE,  pero  fd  no  esta
              abierto   para   lectura.   O  bien  se  solicito  MAP_SHARED  y
              PROT_WRITE  esta  activo,  pero  fd  no  esta  abierto  en  modo
              lectura/escritura (O_RDWR).  O bien PROT_WRITE esta activo, pero
              el fichero es solo para anadir.

       EINVAL No es correcto start o length o offset.   (E.g.,  son  demasiado
              grandes,  o  no  estan  alineados  en  los  limites  de un valor
              multiplo de PAGESIZE).

       ETXTBSY
              MAP_DENYWRITE fue fijado pero el objeto especificado por fd esta
              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   numero   maximo   de
              correspondencias del proceso habria sido excedido.

       ENODEV El  sistema  de  ficheros subyacente del fichero especificado no
              soporta la correspondencia de memoria.

       El uso de una region ubicada puede resultar en estas senales:

       SIGSEGV
              Intento de escritura en una  region  especificada  a  mmap  como
              solo-lectura.

       SIGBUS Intento de acceso a una porcion del buffer que no se corresponde
              con el fichero (por ejemplo,  mas  alla  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  codigos  de  error  ENXIO y ENODEV.  SUSv2 documenta ls codigos de
       error adicionales EMFILE y EOVERFLOW.

       MAP_32BIT es una extension de Linux.

V'EASE TAMBI'EN

       getpagesize(2),  mmap2(2),  mremap(2),  msync(2),   shm_open(2),   B.O.
       Gallmeister, POSIX.4, O'Reilly, pp. 128-129 and 389-391.