remap_file_pages -
非線形ファイルマッピングを作成する。
#define _GNU_SOURCE /* feature_test_macros(7) 参照 */
#include <sys/mman.h>
int remap_file_pages(void *addr, size_t size, int prot,
ssize_t pgoff, int flags);
remap_file_pages()
システムコールは非線形なマッピング、
つまりファイルのページがメモリ上で連続しない順番でマップされる
マッピングを作成するために使われる。
remap_file_pages() を使う方が
mmap(2)
を繰り返して使うより優れている点は、
前者の方法ではカーネルが
VMA (Virtual Memory Area,
仮想メモリ領域)
データ構造体を追加で作成する必要がないことである。
非線形マッピングを作成するためには、
以下のようなステップを実行する:
- 1.
- mmap(2)
を使い、マッピングを作成する
(このマッピングは最初は線形である)。
このマッピングは
MAP_SHARED
フラグを指定して作成されなければならない。
- 2.
- remap_file_pages() を 1
回以上呼び出して、
マッピングのページとファイルのページの対応関係を再構成する。
ファイルの同じページをマッピング領域の複数の場所に
マップすることが可能である。
pgoff と
size
引き数は、マッピング内で再配置されるファイルの領域を指定する。
pgoff
はファイルオフセットであり、単位はシステムのページサイズである。
size
は領域の長さであり、単位はバイトである。
addr 引き数は 2
つの目的で使われる。
第 1
の目的は、この引き数によって再編成したいページの
マッピングを識別することである。
よって
addr は
mmap(2)
の呼び出しで過去にマップされた領域内のアドレスでなければならない。
第 2 の目的は、
pgoff と
size
で識別されるファイルページが置かれる予定のアドレスを、
addr
によって指定することである。
addr と
size
に指定する値は、システムのページサイズの倍数とすべきである。
それ以外の場合、カーネルは「両方」の値を
最も近いページサイズの倍数へ「切り下げる」。
prot 引き数は 0
に指定されなければならない。
flags 引き数は
mmap(2)
のものと同じ意味であるが、
MAP_NONBLOCK
以外の全てのフラグは無視される。
返り値¶
成功した場合、
remap_file_pages() は 0 を返す。
エラーの場合、-1
が返され、
errno
が適切に設定される。
エラー¶
- EINVAL
- addr が MAP_SHARED
フラグを指定して作成された有効なマッピングを参照していない。
- EINVAL
- addr, size, prot, pgoff
のいずれかが不正である。
バージョン¶
remap_file_pages()
システムコールは Linux 2.5.46
で登場した。 glibc
でのサポートは glibc
バージョン 2.3.3
で追加された。
remap_file_pages()
システムコールは Linux
固有のものである。
関連項目¶
getpagesize(2),
mmap(2),
mmap2(2),
mprotect(2),
mremap(2),
msync(2)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。