bionic (2) mremap.2.gz

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

NOMBRE

       mremap - re-asocia una dirección de memoria virtual

SINOPSIS

       #include <unistd.h>
       #include <sys/mman.h>

       void *mremap(void *vieja_dir, size_t viejo_tam , size_t nuevo_tam, unsigned long flags);

DESCRIPCIÓN

       mremap  expande (o encoge) una asociación existente de memoria, moviéndola potencialmente a la vez (según
       se controle por el argumento flags y según el espacio de direcciones virtuales disponible).

       vieja_dir es la dirección antigua del bloque de memoria virtual que  Ud.  quiere  expandir  (o  encoger).
       Observe  que  vieja_dir tiene que tener alineamiento de página. viejo_tam es el antiguo tamaño del bloque
       de memoria virtual. nuevo_tam es el tamaño pedido del bloque de memoria virtual tras el cambio de tamaño.

       El argumento flags es un mapa de bits de opciones.

       En Linux la memoria se divide en páginas. Un proceso de usuario tiene (uno o) varios segmentos de memoria
       virtual lineales. Cada segmento de memoria virtual tiene una o más asociaciones a páginas de memoria real
       (en la tabla de páginas). Cada segmento de memoria  virtual  tiene  su  propia  protección  (derechos  de
       acceso),  que pueden producir una violación de segmento si a la memoria se accede incorrectamente (p.ej.,
       por escribir en un segmento de lectura exclusiva). Acceder a  memoria  virtual  fuera  de  los  segmentos
       también producirá una violación de segmento.

       mremap  emplea  el  esquema  de tabla de páginas de Linux.  mremap cambia la asociación entre direcciones
       virtuales y páginas de memoria. Esto puede emplearse para implementar un realloc muy eficiente.

FLAGS

       MREMAP_MAYMOVE
              indica si la operación, en vez de fallar, debería cambiar la dirección virtual  si  el  cambio  de
              tamaño no puede hacerse en el espacio virtual actual.

VALOR DEVUELTO

       En  caso  de  éxito, mremap devuelve un puntero a la nueva área de memoria virtual.  En caso de error, se
       devuelve -1 y se pone un valor apropiado en errno.

ERRORES

       EINVAL Se ha dado un argumento inválido. Lo más probable  es  que  vieja_dir  no  tenga  alineamiento  de
              página.

       EFAULT "Segmentation  fault",  o  sea,  "fallo  de  segmento".  Alguna  dirección  del  rango vieja_dir a
              vieja_dir+viejo_tam es una dirección de memoria virtual inválida para este proceso.   También  uno
              puede  obtener  EFAULT  incluso  si existen asociaciones que cubren el espacio entero pedido, pero
              esas asociaciones son de tipos diferentes.

       EAGAIN El segmento de memoria está bloqueado y no puede re-asociarse.

       ENOMEM El área  de  memoria  no  puede  expandirse  en  la  dirección  virtual  en  curso,  y  la  opción
              MREMAP_MAYMOVE no está puesta en flags.  O bien, no hay bastante memoria (virtual) disponible.

OBSERVACIONES

       Con  las  cabeceras  actuales  de  glibc,  para obtener la definición de MREMAP_MAYMOVE, necesita definir
       _GNU_SOURCE antes de incluir <sys/mman.h>.

CONFORME A

       Esta llamada es específica de Linux, y no debería emplearse en programas que se pretendan transportables.
       4.2BSD  tenía  una llamada igual (nunca implementada realmente) mremap(2) con una semántica completamente
       diferente.

VÉASE TAMBIÉN

       getpagesize(2), realloc(3), malloc(3), brk(2), sbrk(2), mmap(2)

       Su libro de texto favorito de Sistemas Operativos para más información sobre  la  memoria  paginada.  Por
       ejemplo:  Sistemas  Operativos Modernos por Andrew S. Tannenbaum, Inside Linux por Randolf Bentson, o The
       Design of the UNIX Operating System por Maurice J. Bach.