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 引き数と利用可能な仮想アドレス空間によって決まる)。
old_address は拡張 (または縮小) しようとする仮想メモリーブロック の元のアドレスである。old_address はページ境界に合っていなければ ならない点に注意すること。old_size は元の仮想メモリーブロックの サイズである。 new_size は要求する変更後の仮想メモリーブロックのサイズである。 5 番目の引き数として new_address を指定することができる。下記の MREMAP_FIXED の説明を参照のこと。
Linux ではメモリーはページに分割される。ユーザープロセスは (一つまたは) 複数のリニアな仮想メモリーセグメントを持つ。 それぞれの仮想メモリーセグメントは一つ以上の実メモリーページ にマッピングされている (マッピング情報はページテーブルで管理される)。 仮想メモリーセグメントにはセグメント毎の保護 (アクセス権) が設定されており、 メモリーが不正にアクセスされた場合 (例えば読み込み専用のセグメントに 書き込んだ場合)、セグメンテーション侵害 (segmentation violation) を 引き起こす。また、セグメント外の仮想メモリーにアクセスした場合にも セグメンテーション侵害が発生する。
mremap() は Linux のページテーブル方式を使用する。 mremap() は仮想アドレスとメモリーページのマッピングを変更する。これは非常に効率的な realloc(3) を実装するのに使用されている。
flags ビットマスク引数は 0 または以下のフラグを含む:
old_address と old_size で指定されるメモリーセグメントが (mlock(2) や同様のもので) ロックされている場合、セグメントのサイズが変わったり 再配置されたりした時にロックも維持される。 その結果、プロセスによってロックされるメモリーの量は変化する。
成功した場合は mremap() は新しい仮想メモリー領域へのポインターを返す。 エラーの場合は MAP_FAILED (すなわち (void *) -1) が返され、 errno が適切に設定される。
このコールは 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)
ページ分割されたメモリーについてもっと詳しく知りたいならば、あなたのお気に入りのオペレーティングシステムの教科書を参照してほしい (例えば、 Modern Operating Systems by Andrew S. Tanenbaum, Inside Linux by Randolf Bentson, The Design of the UNIX Operating System by Maurice J. Bach.)
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2010-06-10 | Linux |