MREMAP(2) | Linux Programmer's Manual | MREMAP(2) |
名前
mremap -仮想メモリ・アドレスを再マッピングする書式
#define _GNU_SOURCE /* 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() は既存のメモリ・マッピングの拡張 (または縮小) を行う。同時に移動されることもある ( flags 引き数と利用可能な仮想アドレス空間によって決まる)。- 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), realloc(3), malloc(3)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2010-06-10 | Linux |