用mmap做I/O

 1.   Introduction

   mmap是Linux中一个相对复杂的函数,仅函数的参数就有6个。但是他也是一个十分强大的函数,在文件I/O,进程间通信,和malloc函数的实现中皆有他的身影。mmap的强大来源于他和进程的地址空间存在十分密切的关系。mmap用于创建一个虚拟内存区域(vm_area_struct)。
   mmap六个参数:addr一般置为NULL,先按下不表。length表示映射的内存区域的大小。prot是一组标识位,表示映射的内存区的权限,包括(读,写,执行,无法访问)。flags表示采用怎样的方式去映射内存区域(私有:MAP_PRIVATE,共享:MAP_SHARED)。fd在文件映射时表示文件描述符。offset表示文件映射时文件的起点。fd和offfset只有在文件映射时,才生效。
表1
 
    mmap支持的映射方式如表2所示,共有四种,包括私有文件映射,共享文件映射,私有匿名映射,共享匿名映射。本节我仅就共享文件映射进行讲解。
表2
 
2.  共享文件映射
    共享映射表示多个进程的虚拟地址空间共享(映射到)同一个相应的物理内存中的区域。任何一个进程对虚拟内存区域写入数据,都会导致相应的文件发生更改。文件映射表示我们要将一个文件映射到进程的虚拟地址空间中。下面我用一个执行文件拷贝功能的代码,来讲解一下如何去使用共享文件映射。
    文件的拷贝过程共分为以下几个步骤:
    1>. 打开源文件,并创建一个目的文件。获取文件描述符。
 
    2>. 获取源文件的大小,并设置目的文件的大小和源文件一致。
    开始执行文件的拷贝工作,我们限制每次最多只能拷贝1GB数据(其实我是看APUE这么写的,嘿嘿)。 因为存在这个限制和我们使用memcpy函数复制数据,我们只能多次mmap。copyed表示已经复制的文件大小。cpsize表示本次映射和拷贝的大小。
 
    3>. 调用mmap函数将源文件和目的文件映射到不同的vma,并获取首地址src_addr和dst_addr。
    4>. 使用memcpy函数执行拷贝操作(src_addr to dst_addr)。
    5>. 调用munmap函数释放映射的区域。
3. 总结
    今天只是简单的总结一下如何使用mmap函数去实现文件的拷贝功能,在后续的章节里,我还会就其他的映射方式,和内核相关的原理进行讲解。
4. 参考
a. Linux系统编程手册
b. 深入理解Linux内核
c. 学堂在线Linux分析与应用
 
 

转载于:https://www.cnblogs.com/dennis-wong/p/11483609.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值