1 .\" Copyright (c) 1996 Tom Bjorkholm <tomb@mydata.se>
3 .\" %%%LICENSE_START(GPLv2+_DOC_FULL)
4 .\" This is free documentation; you can redistribute it and/or
5 .\" modify it under the terms of the GNU General Public License as
6 .\" published by the Free Software Foundation; either version 2 of
7 .\" the License, or (at your option) any later version.
9 .\" The GNU General Public License's references to "object code"
10 .\" and "executables" are to be interpreted as the output of any
11 .\" document formatting or typesetting system, including
12 .\" intermediate and printed output.
14 .\" This manual is distributed in the hope that it will be useful,
15 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
16 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 .\" GNU General Public License for more details.
19 .\" You should have received a copy of the GNU General Public
20 .\" License along with this manual; if not, see
21 .\" <http://www.gnu.org/licenses/>.
24 .\" 1996-04-11 Tom Bjorkholm <tomb@mydata.se>
25 .\" First version written (1.3.86)
26 .\" 1996-04-12 Tom Bjorkholm <tomb@mydata.se>
27 .\" Update for Linux 1.3.87 and later
28 .\" 2005-10-11 mtk: Added NOTES for MREMAP_FIXED; revised EINVAL text.
30 .TH MREMAP 2 2017-09-25 "Linux" "Linux Programmer's Manual"
32 mremap \- remap a virtual memory address
35 .BR "#define _GNU_SOURCE" " /* See feature_test_macros(7) */"
36 .B #include <sys/mman.h>
38 .BI "void *mremap(void *" old_address ", size_t " old_size ,
39 .BI " size_t " new_size ", int " flags ", ... /* void *" new_address " */);"
43 expands (or shrinks) an existing memory mapping, potentially
44 moving it at the same time (controlled by the \fIflags\fP argument and
45 the available virtual address space).
47 \fIold_address\fP is the old address of the virtual memory block that you
48 want to expand (or shrink).
49 Note that \fIold_address\fP has to be page
51 \fIold_size\fP is the old size of the
53 \fInew_size\fP is the requested size of the
54 virtual memory block after the resize.
55 An optional fifth argument,
57 may be provided; see the description of
61 If the value of \fIold_size\fP is zero, and \fIold_address\fP refers to
62 a shareable mapping (see
67 will create a new mapping of the same pages.
69 will be the size of the new mapping and the location of the new mapping
70 may be specified with \fInew_address\fP; see the description of
73 If a new mapping is requested via this method, then the
75 flag must also be specified.
77 In Linux the memory is divided into pages.
78 A user process has (one or)
79 several linear virtual memory segments.
80 Each virtual memory segment has one
81 or more mappings to real memory pages (in the page table).
82 Each virtual memory segment has its own
83 protection (access rights), which may cause
84 a segmentation violation if the memory is accessed incorrectly (e.g.,
85 writing to a read-only segment).
86 Accessing virtual memory outside of the
87 segments will also cause a segmentation violation.
90 uses the Linux page table scheme.
93 mapping between virtual addresses and memory pages.
94 This can be used to implement a very efficient
97 The \fIflags\fP bit-mask argument may be 0, or include the following flag:
100 By default, if there is not sufficient space to expand a mapping
101 at its current location, then
104 If this flag is specified, then the kernel is permitted to
105 relocate the mapping to a new virtual address, if necessary.
106 If the mapping is relocated,
107 then absolute pointers into the old mapping location
108 become invalid (offsets relative to the starting address of
109 the mapping should be employed).
111 .BR MREMAP_FIXED " (since Linux 2.3.31)"
112 This flag serves a similar purpose to the
116 If this flag is specified, then
118 accepts a fifth argument,
119 .IR "void\ *new_address" ,
120 which specifies a page-aligned address to which the mapping must
122 Any previous mapping at the address range specified by
131 must also be specified.
133 If the memory segment specified by
139 or similar), then this lock is maintained when the segment is
140 resized and/or relocated.
141 As a consequence, the amount of memory locked by the process may change.
145 returns a pointer to the new virtual memory area.
148 (that is, \fI(void\ *)\ \-1\fP) is returned,
149 and \fIerrno\fP is set appropriately.
153 The caller tried to expand a memory segment that is locked,
154 but this was not possible without exceeding the
159 "Segmentation fault." Some address in the range
160 \fIold_address\fP to \fIold_address\fP+\fIold_size\fP is an invalid
161 virtual memory address for this process.
164 even if there exist mappings that cover the
165 whole address space requested, but those mappings are of different types.
168 An invalid argument was given.
172 \fIold_address\fP was not
190 the new address range specified by
194 overlapped the old address range specified by
200 was specified without also specifying
203 \fIold_size\fP was zero and \fIold_address\fP does not refer to a
204 shareable mapping (but see BUGS);
206 \fIold_size\fP was zero and the
208 flag was not specified.
212 The memory area cannot be expanded at the current virtual address, and the
214 flag is not set in \fIflags\fP.
215 Or, there is not enough (virtual) memory available.
217 This call is Linux-specific, and should not be used in programs
218 intended to be portable.
219 .\" 4.2BSD had a (never actually implemented)
221 .\" call with completely different semantics.
223 Prior to version 2.4, glibc did not expose the definition of
225 and the prototype for
227 did not allow for the
233 is used to move or expand an area locked with
237 call will make a best effort to populate the new area but will not fail
240 if the area cannot be populated.
245 was zero and the mapping referred to by
247 was a private mapping
248 .RB ( mmap "(2) " MAP_PRIVATE ),
250 created a new private mapping unrelated to the original mapping.
251 This behavior was unintended
252 and probably unexpected in user-space applications
253 (since the intention of
255 is to create a new mapping based on the original mapping).
257 .\" commit dba58d3b8c5045ad89c1c95d33d01451e3964db7
272 Your favorite text book on operating systems
273 for more information on paged memory
274 (e.g., \fIModern Operating Systems\fP by Andrew S.\& Tanenbaum,
275 \fIInside Linux\fP by Randolf Bentson,
276 \fIThe Design of the UNIX Operating System\fP by Maurice J.\& Bach)