mremapのヘルプ・マニュアル
日本語 英語
mremap --help
man mremap
MREMAP(2) Linux Programmer’s Manual MREMAP(2)
名前
mremap - 仮想メモリ・アドレスを再マッピングする
書式
#define _GNU_SOURCE
#include
void *mremap(void *old_address, size_t old_size,
size_t new_size, int flags);
説明
mremap() は既存のメモリ・マッピングの拡張 (または縮小) を行う。同時に移
動されることもある (flags 引き数と利用可能な仮想アドレス空間によって 決
まる)。
old_address は拡張 (または縮小) しようとする仮想メモリ・ブロックの元の
アドレスである。old_address はページ境界に合っていなければならない点 に
注 意 す る こ と 。old_size は元の仮想メモリ・ブロックのサイズである。
new_size は要求する変更後の仮想メモリ・ブロックのサイズである。
Linux ではメモリはページに分割される。ユーザー・プロセスは (一つまたは)
複 数のリニアな仮想メモリセグメントを持つ。それぞれの仮想メモリセグメン
トは一つ以上の実メモリ・ページにマッピングされている (マッピング情報 は
ページ・テーブルで管理される)。仮想メモリセグメントにはセグメント毎の保
護 (アクセス権) が設定されており、メモリが不正にアクセスされた場合 ( 例
え ば 読み込み専用のセグメントに書き込んだ場合)、セグメンテーション侵害
(segmentation violation) を引き起こす。また、セグメント外の仮想メモリに
アクセスした場合にもセグメンテーション侵害が発生する。
mremap() は Linux のページ・テーブル方式を使用する。 mremap() は仮想ア
ドレスとメモリ・ページのマッピングを変更する。これは非常 に 効 率 的 な
realloc(3) を実装するのに使用されている。
flags ビットマスク引数は 0 または以下のフラグを含む:
MREMAP_MAYMOVE
デフォルトでは、現在の位置にマッピングを拡張するための十分な空き
がなければ mremap() は失敗する。このフラグが指定されると、カーネ
ルは必要があればマッピングを新しい仮想アドレスに再配置することが
できるマッピングが再配置されると、古いマッピング位置への絶対ポイ
ンタは無効になる (マッピングの開始アドレスからの相対オフセットは
有効のままである)。
MREMAP_FIXED (Linux 2.3.31 以降)
このフラグは mmap(2) の MAP_FIXED フラグと似たような目的で用いら
れる。このフラグが指定されると、 mremap() は 5 番目の引き数 void
*new_address を受け取り、この引数はマッピングが移動されるべき ア
ドレスを指定する。このアドレスはページ境界に合っていなければなら
ない。 new_address と new_size で指定されるアドレス範囲に過去 の
マ ッ ピ ン グ が あ っ た場合、そのマッピングはアンマップされる
(unmapped)。 MREMAP_FIXED を指定した場合は、 MREMAP_MAYMOVE も指
定しなければならない。
old_address と old_size で指定されるメモリセグメントが (mlock(2) や同様
のもので) ロックされている場合、セグメントのサイズが変わったり再配置 さ
れ たりした時にロックも維持される。その結果、プロセスによってロックされ
るメモリの量は変化する。
返り値
成功した場合は mremap() は新しい仮想メモリ領域へのポインタを返す。エ ラ
ー の場合は MAP_FAILED (すなわち (void *) -1) が返され、 errno が適切に
設定される。
エラー
EAGAIN 呼び出し元がロックされているメモリセグメントを拡張しようとしたが
、 RLIMIT_MEMLOCK リソース制限を越えずにこれを行うことができない
。
EFAULT 「セグメンテーション違反(segmentation fault)」 old_address か ら
old_address+old_size の範囲のアドレスのどれかがこのプロセスにお
いて不正な仮想メモリ・アドレスである。たとえ要求したアドレス空間
全体を含むようなマッピングがあったとしても、それらのマッピングが
異なった型ならば EFAULT を受け取るだろう。
EINVAL 不正な引き数が与えられた。可能性のある原因は以下の通りである: た
い て い は old_address が ペ ー ジ境界に合ってない; flags に
MREMAP_MAYMOVE または MREMAP_FIXED 以外の値が指定さ れ て い る;
new_size が ゼ ロ; new_size ま たは new_address の値が不正;
new_address と new_size で指定される新し い ア ド レ ス 範 囲 が
old_address と old_size で指定される古いアドレス範囲と重なってい
る; MREMAP_FIXED が指定されているが MREMAP_MAYMOVE が指定され て
いない。
ENOMEM 現在の仮想アドレスではメモリ領域が拡張できず、 MREMAP_MAYMOVE フ
ラグが flags に設定されていない。または十分な (仮想) メモリが 存
在しない。
準拠
このコールは Linux 特有であり、移植を意図したプログラムで使用すべきでは
ない。
注意
バージョン 2.4 より前の glibc では、 MREMAP_FIXED の定義は公開されて お
らず、 mremap() のプロトタイプは new_address 引き数を取らなかった。
関連項目
brk(2), getpagesize(2), getrlimit(2), mlock(2), mmap(2), sbrk(2), real-
loc(3), malloc(3), feature_test_macros(7)
ページ分割されたメモリについてもっと詳しく知りたいならばあなたの好み の
OS の教科書を参照すること。 (Modern Operating Systems by Andrew S. Tan-
nenbaum, Inside Linux by Randolf Bentson, The Design of the UNIX Oper-
ating System by Maurice J. Bach.)
Linux 2005-09-13 MREMAP(2)
MREMAP(2) Linux Programmer’s Manual MREMAP(2)
NAME
mremap - re-map a virtual memory address
SYNOPSIS
#define _GNU_SOURCE
#include
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 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 viola-
tion.
mremap() uses the Linux page table scheme. mremap() changes the map-
ping 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 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 relo-
cated, 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 previ-
ous 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 seg-
ment is resized and/or relocated. As a consequence, the amount of mem-
ory 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 appropriately.
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 map-
pings 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 spec-
ified 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), mal-
loc(3), realloc(3), feature_test_macros(7)
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.)
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.kernel.org/doc/man-pages/.
Linux 2005-09-13 MREMAP(2)