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/
に書かれている。