名称

remap_file_pages-创建非线性文件映射

REMAP_FILE_PAGES - Linux手册页

Linux程序员手册 第2部分
更新日期: 2017-09-15

版本

remap_file_pages()系统调用出现在Linux 2.5.46中。 glibc支持已在2.3.3版中添加。

另外参见

getpagesize(2),mmap(2),mmap2(2),mprotect(2),mremap(2),msync(2)

返回值

成功时,remap_file_pages()返回0。错误时,返回-1,并正确设置errno。

语法

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <sys/mman.h>

int remap_file_pages(void *addr, size_t size, int prot,
                     size_t pgoff, int flags);

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

备注

从Linux 2.6.23开始,remap_file_pages()仅在内存文件系统(例如tmpfs(5),heugetlbfs或ramfs)上创建非线性映射。在具有后备存储的文件系统上,remap_file_pages()的效率不比使用mmap(2)调整文件的哪些部分映射到哪些地址有效。

遵循规范

remap_file_pages()系统调用是特定于Linux的。

说明

注意:从Linux 3.16开始,此系统调用被标记为已弃用。在Linux 4.0中,该实现被较慢的内核内仿真代替。很少有使用此系统调用的应用程序,应考虑迁移到替代产品。进行此更改是因为此系统调用的内核代码很复杂,并且据信使用很少,甚至完全没有使用。尽管在32位系统上的数据库应用程序中有一些用例,但在64位系统上不存在这些用例。

remap_file_pages()系统调用用于创建非线性映射,即,将文件的页面映射到内存中非顺序的映射。与重复使用mmap(2)相比,使用remap_file_pages()的优势在于,前一种方法不需要内核创建其他VMA(虚拟内存区域)数据结构。

要创建非线性映射,我们执行以下步骤:

1.
使用mmap(2)创建一个映射(最初是线性的)。必须使用MAP_SHARED标志创建此映射。
2.
使用一个或多个调用remap_file_pages()来重新排列映射页面和文件页面之间的对应关系。可以将文件的同一页面映射到映射区域内的多个位置。

pgoff和size参数指定要在映射中重定位的文件区域:pgoff是文件偏移量,以系统页面大小为单位; size是区域的长度(以字节为单位)。

addr参数有两个目的。首先,它标识我们要重新排列其页面的映射。因此,addr必须是一个地址,该地址位于先前通过调用mmap(2)映射的区域内。其次,addr指定将放置由pgoff和size标识的文件页面的地址。

在addr和size中指定的值应该是系统页面大小的倍数。如果不是,则内核将两个值都舍入为页面大小的最接近倍数。

prot参数必须指定为0。

flags参数的含义与mmap(2)的含义相同,但是除MAP_NONBLOCK以外的所有其他标志均被忽略。

错误说明

EINVAL
addr不会引用使用MAP_SHARED标志创建的有效映射。
EINVAL
addrsize,prot或pgoff无效。
日期:2019-08-20 17:59:14 来源:oir作者:oir