用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做I/O      mmap支持的映射方式如表2所示,共有四种,包括私有文件映射,共享文件映射,私有匿名映射,共享匿名映射。本节我仅就共享文件映射进行讲解。 表2 用mmap做I/O  2.  共享文件映射     共享映射表示多个进程的虚拟地址空间共享(映射到)同一个相应的物理内存中的区域。任何一个进程对虚拟内存区域写入数据,都会导致相应的文件发生更改。文件映射表示我们要将一个文件映射到进程的虚拟地址空间中。下面我用一个执行文件拷贝功能的代码,来讲解一下如何去使用共享文件映射。     文件的拷贝过程共分为以下几个步骤:
    1>. 打开源文件,并创建一个目的文件。获取文件描述符。
用mmap做I/O      2>. 获取源文件的大小,并设置目的文件的大小和源文件一致。 用mmap做I/O     开始执行文件的拷贝工作,我们限制每次最多只能拷贝1GB数据(其实我是看APUE这么写的,嘿嘿)。 因为存在这个限制和我们使用memcpy函数复制数据,我们只能多次mmap。copyed表示已经复制的文件大小。cpsize表示本次映射和拷贝的大小。
用mmap做I/O      3>. 调用mmap函数将源文件和目的文件映射到不同的vma,并获取首地址src_addr和dst_addr。     4>. 使用memcpy函数执行拷贝操作(src_addr to dst_addr)。     5>. 调用munmap函数释放映射的区域。 用mmap做I/O3. 总结     今天只是简单的总结一下如何使用mmap函数去实现文件的拷贝功能,在后续的章节里,我还会就其他的映射方式,和内核相关的原理进行讲解。 4. 参考 a. Linux系统编程手册 b. 深入理解Linux内核 c. 学堂在线Linux分析与应用    
上一篇:《内核kernel:mmap内存映射模块编写》


下一篇:如何在不崩溃Linux内核的情况下访问mmaped / dev / mem?