MREMAP(2)

NOMBRE
mremap - re-mapea una dirección virtual de memoria

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

void * mremap(void * old_address, size_t old_size , size_t new_size, unsigned long flags);

DESCRIPCIÓN
mremap expande (or shrinks) unmapeado de memoria existente, moviéndolo potencialmente al mismo tiempo (controlado por el argumento flags y el espacio de direccionamiento virtual disponiblet). old_address es la antigua dirección del bloque de memoria virtual que Ud. quiere expandir (or shrink). Nótese que old_address tiene que ser alineado de página. old_size es el antiguo tamaño del bloque de memoria virtual. new_size es al tamaño requerido del bloque de memoria virtual después de redimensionar. EL argumento flags es un bitmap de flags. En Linux, la memoria está dividida en páginas. Un porceso de usuario tiene (uno o) varios segmentos de memoria virtuales lineales. Cada segmento de memoria virtual tiene uno o más mapeados a páginas de memoria reales (acceso correcto), los cuales pueden causar una violación de segmentación si se accede incorrectamente a la memoria (por ejemplo, escribiendo en un segmento de sólo lectura). Acceder a memoria virtual fuera de los segmentos cusará también violación de segmentación. mremap usa el esquema de tabla de página de Linux. mremap cambia el mapeado entre direccionamiento virtual y páginas de memoria.

FLAGS

MREMAP_MAYMOVE
    indica si la operación debería fallar, o cambiar el direccionamiento virtual si el redimencionado no se puede hacer con el actual direccionamiento virtual.

RETURN VALUE
Si éxito mremap devuelve un puntero a la nueva área de memoria virtual. Si error, -1 es devuleto, y errno está configurado apropiadamente.

ERRORES

EINVAL
    Fue dado un argumento no válido. Lo más probable es que old_address no alineó la página.

EFAULT
    "Segmentation fault." Algunas direcciones en el rango old_address to old_address+old_size es una direccón no válida de memroira virtual para este proceso. No obstante puedes obtener EFAULT siempre si existen mapeados que cubren el espacio de direcciones requerido, pero esos mapeados son de diferentes tipos.

EAGAIN
    El segmento de memoria está bloqueado y no se puede remapear.

ENOMEM
    El área de memoria no puede ser expandida en la actual dirección virtual, y el MREMAP_MAYMOVE flag no está puesto en flags. O, no hay suficiente memoria(virtual) disponible.

CONFORMING TO
Esta llamada es específica de Linux, y no debe ser usada en programas que pretendan ser portados. 4.2BSD had a (never actually implemented) mremap(2) call with completely different semantics.

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

Tu favorito libro de OS para más información acerca de paginado de memoria. (Modern Operating Systems by Andrew S. Tannenbaum, Inside Linux by Randolf Bentson, The Design of the UNIX Operating System by Maurice J. Bach.)