Provided by:
manpages-es_1.55-10_all 
NOMBRE
mremap - re-asocia una direccion 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'ON
mremap expande (o encoge) una asociacion existente de memoria,
moviendola potencialmente a la vez (segun se controle por el argumento
flags y segun el espacio de direcciones virtuales disponible).
vieja_dir es la direccion antigua del bloque de memoria virtual que Ud.
quiere expandir (o encoger). Observe que vieja_dir tiene que tener
alineamiento de pagina. viejo_tam es el antiguo tamano del bloque de
memoria virtual. nuevo_tam es el tamano pedido del bloque de memoria
virtual tras el cambio de tamano.
El argumento flags es un mapa de bits de opciones.
En Linux la memoria se divide en paginas. Un proceso de usuario tiene
(uno o) varios segmentos de memoria virtual lineales. Cada segmento de
memoria virtual tiene una o mas asociaciones a paginas de memoria real
(en la tabla de paginas). Cada segmento de memoria virtual tiene su
propia proteccion (derechos de acceso), que pueden producir una
violacion 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 tambien producira una violacion de
segmento.
mremap emplea el esquema de tabla de paginas de Linux. mremap cambia
la asociacion entre direcciones virtuales y paginas de memoria. Esto
puede emplearse para implementar un realloc muy eficiente.
FLAGS
MREMAP_MAYMOVE
indica si la operacion, en vez de fallar, deberia cambiar la
direccion virtual si el cambio de tamano no puede hacerse en el
espacio virtual actual.
VALOR DEVUELTO
En caso de exito, mremap devuelve un puntero a la nueva area 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 invalido. Lo mas probable es que
vieja_dir no tenga alineamiento de pagina.
EFAULT "Segmentation fault", o sea, "fallo de segmento". Alguna
direccion del rango vieja_dir a vieja_dir+viejo_tam es una
direccion de memoria virtual invalida para este proceso.
Tambien 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 esta bloqueado y no puede re-asociarse.
ENOMEM El area de memoria no puede expandirse en la direccion virtual
en curso, y la opcion MREMAP_MAYMOVE no esta puesta en flags. O
bien, no hay bastante memoria (virtual) disponible.
OBSERVACIONES
Con las cabeceras actuales de glibc, para obtener la definicion de
MREMAP_MAYMOVE, necesita definir _GNU_SOURCE antes de incluir
<sys/mman.h>.
CONFORME A
Esta llamada es especifica de Linux, y no deberia emplearse en
programas que se pretendan transportables. 4.2BSD tenia una llamada
igual (nunca implementada realmente) mremap(2) con una semantica
completamente diferente.
V'EASE TAMBI'EN
getpagesize(2), realloc(3), malloc(3), brk(2), sbrk(2), mmap(2)
Su libro de texto favorito de Sistemas Operativos para mas informacion
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.