mirror of https://github.com/mkerrisk/man-pages
120 lines
4.4 KiB
Groff
120 lines
4.4 KiB
Groff
|
.\" Hey Emacs! This file is -*- nroff -*- source.
|
||
|
.\"
|
||
|
.\" Copyright (c) 1996 Tom Bjorkholm <tomb@mydata.se>
|
||
|
.\"
|
||
|
.\" This is free documentation; you can redistribute it and/or
|
||
|
.\" modify it under the terms of the GNU General Public License as
|
||
|
.\" published by the Free Software Foundation; either version 2 of
|
||
|
.\" the License, or (at your option) any later version.
|
||
|
.\"
|
||
|
.\" The GNU General Public License's references to "object code"
|
||
|
.\" and "executables" are to be interpreted as the output of any
|
||
|
.\" document formatting or typesetting system, including
|
||
|
.\" intermediate and printed output.
|
||
|
.\"
|
||
|
.\" This manual is distributed in the hope that it will be useful,
|
||
|
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
.\" GNU General Public License for more details.
|
||
|
.\"
|
||
|
.\" You should have received a copy of the GNU General Public
|
||
|
.\" License along with this manual; if not, write to the Free
|
||
|
.\" Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111,
|
||
|
.\" USA.
|
||
|
.\"
|
||
|
.\" 1996-04-11 Tom Bjorkholm <tomb@mydata.se>
|
||
|
.\" First version written (1.3.86)
|
||
|
.\" 1996-04-12 Tom Bjorkholm <tomb@mydata.se>
|
||
|
.\" Update for Linux 1.3.87 and later
|
||
|
.\"
|
||
|
.TH MREMAP 2 1996-04-12 "Linux 1.3.87" "Linux Programmer's Manual"
|
||
|
.SH NAME
|
||
|
mremap \- re-map a virtual memory address
|
||
|
.SH SYNOPSIS
|
||
|
.B #include <unistd.h>
|
||
|
.br
|
||
|
.B #include <sys/mman.h>
|
||
|
.sp
|
||
|
.BI "void * mremap(void *" old_address ", size_t " old_size
|
||
|
.BI ", size_t " new_size ", unsigned long " flags );
|
||
|
.fi
|
||
|
.SH DESCRIPTION
|
||
|
\fBmremap\fR expands (or shrinks) an existing memory mapping, potentially
|
||
|
moving it at the same time (controlled by the \fIflags\fR argument and
|
||
|
the available virtual address space).
|
||
|
|
||
|
\fIold_address\fR is the old address of the virtual memory block that you
|
||
|
want to expand (or shrink). Note that \fIold_address\fR has to be page
|
||
|
aligned. \fIold_size\fR is the old size of the
|
||
|
virtual memory block. \fInew_size\fR is the requested size of the
|
||
|
virtual memory block after the resize.
|
||
|
|
||
|
The \fIflags\fR argument is a bitmap of flags.
|
||
|
|
||
|
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 violation.
|
||
|
|
||
|
\fBmremap\fR uses the Linux page table scheme. \fBmremap\fR changes the
|
||
|
mapping between virtual addresses and memory pages. This can be used to
|
||
|
implement a very efficient \fBrealloc\fR.
|
||
|
|
||
|
.SH FLAGS
|
||
|
.TP
|
||
|
.B MREMAP_MAYMOVE
|
||
|
indicates if the operation should fail, or change the virtual address
|
||
|
if the resize cannot be done at the current virtual address.
|
||
|
|
||
|
.SH "RETURN VALUE"
|
||
|
On success \fBmremap\fR returns a pointer to the new virtual memory area.
|
||
|
On error, the value
|
||
|
.B MAP_FAILED
|
||
|
(that is, (void *) \-1) is returned, and \fIerrno\fR is set appropriately.
|
||
|
|
||
|
.SH ERRORS
|
||
|
.TP
|
||
|
.B EAGAIN
|
||
|
The memory segment is locked and cannot be re-mapped.
|
||
|
.TP
|
||
|
.B EFAULT
|
||
|
"Segmentation fault." Some address in the range
|
||
|
\fIold_address\fP to \fIold_address\fP+\fIold_size\fP 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.
|
||
|
.TP
|
||
|
.B EINVAL
|
||
|
An invalid argument was given. Most likely \fIold_address\fR was not
|
||
|
page aligned.
|
||
|
.TP
|
||
|
.B ENOMEM
|
||
|
The memory area cannot be expanded at the current virtual address, and the
|
||
|
.B MREMAP_MAYMOVE
|
||
|
flag is not set in \fIflags\fP.
|
||
|
Or, there is not enough (virtual) memory available.
|
||
|
.SH NOTES
|
||
|
With current glibc includes, in order to get the definition of
|
||
|
.BR MREMAP_MAYMOVE ,
|
||
|
you need to define _GNU_SOURCE before including <sys/mman.h>.
|
||
|
.SH "CONFORMING TO"
|
||
|
This call is Linux-specific, and should not be used in programs
|
||
|
intended to be portable. 4.2BSD had a (never actually implemented)
|
||
|
.BR mremap (2)
|
||
|
call with completely different semantics.
|
||
|
.SH "SEE ALSO"
|
||
|
.BR brk (2),
|
||
|
.BR getpagesize (2),
|
||
|
.BR mmap (2),
|
||
|
.BR sbrk (2),
|
||
|
.BR malloc (3),
|
||
|
.BR realloc (3)
|
||
|
.P
|
||
|
Your favorite OS text book for more information on paged memory.
|
||
|
(\fIModern Operating Systems\fR by Andrew S. Tannenbaum,
|
||
|
\fIInside Linux\fR by Randolf Bentson,
|
||
|
\fIThe Design of the UNIX Operating System\fR by Maurice J. Bach.)
|