Seth Woolley's Man Viewer

mremap(2) - mremap, mremap - re-map a virtual memory address - man 2 mremap

([section] manual, -k keyword, -K [section] search, -f whatis)
man plain no title

MREMAP(2)                  Linux Programmer's Manual                 MREMAP(2)



NAME
       mremap - re-map a virtual(5,8) memory address

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

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

DESCRIPTION
       mremap expands (or shrinks) an  existing  memory  mapping,  potentially
       moving  it  at  the same time(1,2,n) (controlled by the flags argument and the
       available virtual(5,8) address space).

       old_address is the old address of the virtual(5,8)  memory  block  that  you
       want  to  expand  (or  shrink).   Note  that old_address has to be page
       aligned. old_size  is  the  old  size  of  the  virtual(5,8)  memory  block.
       new_size  is  the  requested size of the virtual(5,8) memory block after the
       resize.

       The flags argument is a bitmap of flags.

       In Linux the memory is divided into pages.  A user process has (one or)
       several  linear  virtual(5,8)  memory segments.  Each virtual(5,8) memory segment
       has one or more mappings to real memory  pages  (in(1,8)  the  page  table).
       Each  virtual(5,8)  memory  segment  has its own protection (access(2,5) rights),
       which may cause a segmentation violation  if(3,n)  the  memory  is  accessed
       incorrectly  (e.g., writing to a read-only segment).  Accessing virtual(5,8)
       memory outside of the segments will also cause  a  segmentation  viola-
       tion.

       mremap  uses  the  Linux page table scheme.  mremap changes the mapping
       between virtual(5,8) addresses and memory pages.  This can be used to imple-
       ment a very efficient realloc.


FLAGS
       MREMAP_MAYMOVE
              indicates  if(3,n)  the  operation should fail, or change the virtual(5,8)
              address if(3,n) the resize cannot be  done  at  the  current  virtual(5,8)
              address.


RETURN VALUE
       On success mremap returns a pointer to the new virtual(5,8) memory area.  On
       error(8,n), the value MAP_FAILED (that is, (void *)  -1)  is  returned,  and
       errno is set(7,n,1 builtins) appropriately.


ERRORS
       EAGAIN The memory segment is locked and cannot be re-mapped.

       EFAULT "Segmentation  fault."  Some address in(1,8) the range old_address to
              old_address+old_size is an invalid virtual(5,8)  memory  address  for
              this  process.  You can also get EFAULT even if(3,n) there exist map-
              pings that cover the whole address space  requested,  but  those
              mappings are of different types.

       EINVAL An  invalid  argument was given. Most likely old_address was not
              page aligned.

       ENOMEM The memory area  cannot  be  expanded  at  the  current  virtual(5,8)
              address,  and  the MREMAP_MAYMOVE flag is not set(7,n,1 builtins) in(1,8) flags.  Or,
              there is not enough (virtual(5,8)) memory available.

NOTES
       With current  glibc  includes,  in(1,8)  order  to  get  the  definition  of
       MREMAP_MAYMOVE,   you  need  to  define  _GNU_SOURCE  before  including
       <sys/mman.h>.

CONFORMING TO
       This call is  Linux-specific,  and  should  not  be  used  in(1,8)  programs
       intended  to  be  portable.   4.2BSD had a (never actually implemented)
       mremap(2) call with completely different semantics.

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

       Your favorite OS text book for more information on paged memory.  (Mod-
       ern  Operating Systems by Andrew S. Tannenbaum, Inside Linux by Randolf
       Bentson, The Design of the UNIX Operating System by Maurice J. Bach.)



Linux 1.3.87                      1996-04-12                         MREMAP(2)

References for this manual (incoming links)