非线性映射

本文介绍了非线性映射的概念,通过示例代码展示了如何使用`remap_file_pages`函数颠倒文件的映射页,实现非线性映射。文章还简述了内核中`remap_file_pages`的实现过程,包括系统调用的检查、页表的修改等关键步骤。
摘要由CSDN通过智能技术生成
mmap是将一个文件中的连续部分映射到虚拟内存中的一块连续的区域,它做的映射是线性映射,如果需要将一个文件中的不同部分以不同的顺序映射到虚拟内存中的连续区域,则需要使用多个mmap映射,从消耗的资源来看这样做代价比较昂贵(因为分配的vm_area_struct多了)。内核提供了一个系统调用叫做remap_file_pages,通过这个函数可以实现非线性映射,同时不需要分配更多的vm_area_struct。下面先看一下这个系统调用是怎么用的,然后说一下非线性映射在内核中是怎么实现的。
该函数包含在头文件 sys/mman.h中,函数原型如下:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值