mremap(2) - phpMan

Command: man perldoc info search(apropos)  


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



NAME
       mremap - re-map a virtual memory address

SYNOPSIS
       #define _GNU_SOURCE
       #include <sys/mman.h>

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

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

       old_address  is the old address of the virtual 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 memory block.  new_size is the requested size of the virtual
       memory block after the resize.

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

       mremap()  uses  the  Linux page table scheme.  mremap() changes the mapping between
       virtual addresses and memory pages.  This can be used to implement a very efficient
       realloc(3).

       The flags bit-mask argument may be 0, or include the following flag:

       MREMAP_MAYMOVE
              By default, if there is not sufficient space to expand a mapping at its cur-
              rent location, then mremap() fails.  If this flag  is  specified,  then  the
              kernel  is  permitted  to  relocate the mapping to a new virtual address, if
              necessary.  If the mapping is relocated, then absolute pointers into the old
              mapping location become invalid (offsets relative to the starting address of
              the mapping should be employed).

       MREMAP_FIXED (since Linux 2.3.31)
              This flag serves a similar purpose to the MAP_FIXED  flag  of  mmap(2).   If
              this  flag  is  specified,  then  mremap()  accepts  a  fifth argument, void
              *new_address, which specifies a page-aligned address to  which  the  mapping
              must  be  moved.   Any  previous  mapping  at the address range specified by
              new_address and new_size is unmapped.  If MREMAP_FIXED  is  specified,  then
              MREMAP_MAYMOVE must also be specified.

       If  the  memory  segment  specified  by  old_address  and old_size is locked (using
       mlock(2) or similar), then this lock is maintained  when  the  segment  is  resized
       and/or relocated.  As a consequence, the amount of memory locked by the process may
       change.

RETURN VALUE
       On success mremap() returns a pointer to the new virtual memory  area.   On  error,
       the value MAP_FAILED (that is, (void *) -1) is returned, and errno is set appropri-
       ately.

ERRORS
       EAGAIN The caller tried to expand a memory segment that is locked, but this was not
              possible without exceeding the RLIMIT_MEMLOCK resource limit.

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

       EINVAL An invalid argument was given.  Possible causes  are:  old_address  was  not
              page  aligned;  a value other than MREMAP_MAYMOVE or MREMAP_FIXED was speci-
              fied in flags; new_size was zero; new_size or new_address  was  invalid;  or
              the  new  address range specified by new_address and new_size overlapped the
              old address range specified by old_address and old_size; or MREMAP_FIXED was
              specified without also specifying MREMAP_MAYMOVE.

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

CONFORMING TO
       This  call  is  Linux-specific,  and  should not be used in programs intended to be
       portable.

NOTES
       Prior to version 2.4, glibc did not expose the definition of MREMAP_FIXED, and  the
       prototype for mremap() did not allow for the new_address argument.

SEE ALSO
       brk(2),  getpagesize(2), getrlimit(2), mlock(2), mmap(2), sbrk(2), malloc(3), real-
       loc(3), feature_test_macros(7)

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

COLOPHON
       This page is part of release 3.22 of the Linux man-pages project.  A description of
       the  project, and information about reporting bugs, can be found at http://www.ker-
       nel.org/doc/man-pages/.



Linux                             2005-09-13                         MREMAP(2)

Generated by $Id: phpMan.php,v 4.55 2007/09/05 04:42:51 chedong Exp $ Author: Che Dong
On Apache
Under GNU General Public License
2017-12-13 03:31 @127.0.0.1 CrawledBy CCBot/2.0 (http://commoncrawl.org/faq/)
Valid XHTML 1.0!Valid CSS!