首页 > 其他 > 详细

用mmap做I/O

时间:2019-09-07 23:53:02      阅读:194      评论:0      收藏:0      [点我收藏+]

 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分析与应用
 
 

用mmap做I/O

原文:https://www.cnblogs.com/dennis-wong/p/11483609.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!