mremap - remap a virtual memory address


   #define _GNU_SOURCE         /* See feature_test_macros(7) */
   #include <sys/mman.h>

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


   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.   An optional fifth argument, new_address, may be provided; see
   the description of MREMAP_FIXED below.

   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 mappings 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

   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:

          By default, if there is not sufficient space to expand a mapping
          at its current 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.


   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 appropriately.


   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 specified 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.


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


   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.

   If  mremap()  is used to move or expand an area locked with mlock(2) or
   equivalent, the mremap() call will make a best effort to  populate  the
   new area but will not fail with ENOMEM if the area cannot be populated.


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

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


   This  page  is  part of release 4.09 of the Linux man-pages project.  A
   description of the project, information about reporting bugs,  and  the
   latest     version     of     this    page,    can    be    found    at


Personal Opportunity - Free software gives you access to billions of dollars of software at no cost. Use this software for your business, personal use or to develop a profitable skill. Access to source code provides access to a level of capabilities/information that companies protect though copyrights. Open source is a core component of the Internet and it is available to you. Leverage the billions of dollars in resources and capabilities to build a career, establish a business or change the world. The potential is endless for those who understand the opportunity.

Business Opportunity - Goldman Sachs, IBM and countless large corporations are leveraging open source to reduce costs, develop products and increase their bottom lines. Learn what these companies know about open source and how open source can give you the advantage.

Free Software

Free Software provides computer programs and capabilities at no cost but more importantly, it provides the freedom to run, edit, contribute to, and share the software. The importance of free software is a matter of access, not price. Software at no cost is a benefit but ownership rights to the software and source code is far more significant.

Free Office Software - The Libre Office suite provides top desktop productivity tools for free. This includes, a word processor, spreadsheet, presentation engine, drawing and flowcharting, database and math applications. Libre Office is available for Linux or Windows.

Free Books

The Free Books Library is a collection of thousands of the most popular public domain books in an online readable format. The collection includes great classical literature and more recent works where the U.S. copyright has expired. These books are yours to read and use without restrictions.

Source Code - Want to change a program or know how it works? Open Source provides the source code for its programs so that anyone can use, modify or learn how to write those programs themselves. Visit the GNU source code repositories to download the source.


Study at Harvard, Stanford or MIT - Open edX provides free online courses from Harvard, MIT, Columbia, UC Berkeley and other top Universities. Hundreds of courses for almost all major subjects and course levels. Open edx also offers some paid courses and selected certifications.

Linux Manual Pages - A man or manual page is a form of software documentation found on Linux/Unix operating systems. Topics covered include computer programs (including library and system calls), formal standards and conventions, and even abstract concepts.