REMAP_FILE_PAGES(2)

名前
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,
                     size_t pgoff, int flags);

説明
Note: this system call was marked as deprecated starting with Linux 3.16. In Linux 4.0, the implementation was replaced by a slower in-kernel emulation. Those few applications that use this system call should consider migrating to alternatives. This change was made because the kernel code for this system call was complex, and it is believed to be little used or perhaps even completely unused. While it had some use cases in database applications on 32-bit systems, those use cases don't exist on 64-bit systems.

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 固有のものである。

注意
Linux 2.6.23 以降、 remap_file_pages() は tmpfs(5), hugetlbfs, ramfs などのインメモリーファイルシステム上にのみ非線形マッピングを作成する。 裏にデータストアを持つファイルシステム上では、 remap_file_pages() は、 ファイルのどの部分がどのアドレスにマッピングされているかの調整が、 mmap(2) を使った場合ほど効率的ではない。

関連項目
getpagesize(2), mmap(2), mmap2(2), mprotect(2), mremap(2), msync(2)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。