int remap_file_pages(void *start, size_t size, int prot, ssize_t pgoff, int flags);
要创建非线性映射,必须执行以下步骤。
1.用函数mmap创建一个线性映射,该映射的flag必须为MAP_SHARED。
2.调用一次或者多次remap_file_pages,对已经映射了的文件上的位置和虚拟内存中的地址的映射关系进行重新排列。
remap_file_pages的作用是将文件上pgoff和size标识的区域移动到一个新的位置。
start: 标识移动的目标位置,因此该地址必须位于第一步中用mmap创建的映射范围中。
size: 要移动的区域的长度,以字节为单位。
pgoff: 制定了要移动区域在文件中的偏移量,以页为单位。
prot: 必须为0
flags: 和mmap中的flags的含义是一样的。
下面看一段示例代码,代码的作用是将一个文件text的第一页和第二页颠倒映射,text文件的前4096个字节全部为字母a,后4096个字节全部为字母b。
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <memory.h>
#define LEN 8192
int main(void)
{
int i, fd, ret;
char str[LEN] = {0};
char path[256] = {0};
char* start = NULL;
unsigned int sum = 0;
fd = open("text", O_RDWR);
start = mmap(NULL, LEN, PROT_READ