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的更多相关文章

  1. Linux 视频设备驱动V4L2最常用的控制命令

    http://blog.csdn.net/shaolyh/article/details/6583226 Linux 视频设备驱动V4L2最常用的控制命令使用说明(1.02) 命令 功能 VIDIOC ...

  2. Linux驱动框架之framebuffer驱动框架

    1.什么是framebuffer? (1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备.帧缓冲 ...

  3. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  4. Top命令内存占用剖析

    原文: http://yalung929.blog.163.com/blog/static/203898225201212981731971/ 引 言: top命令作为Linux下最常用的性能分析工具 ...

  5. Linux之V4L2视频采集编程详解

     V4L2(Video For Linux Two) 是内核提供给应用程序访问音.视频驱动的统一接口. Linux系统中,视频设备被当作一个设备文件来看待,设备文件存放在 /dev目录下,完整路径的设 ...

  6. 转 linux进程内存到底怎么看 剖析top命令显示的VIRT RES SHR值

    引 言: top命令作为Linux下最常用的性能分析工具之一,可以监控.收集进程的CPU.IO.内存使用情况.比如我们可以通过top命令获得一个进程使用了多少虚拟内存(VIRT).物理内存(RES). ...

  7. rocketmq 主机负载异常飙高问题的解决

    最近在部署rocketmq到物理机时, 发现并解决了一个主机Load异常飙高的问题, 觉得有必要记录一下. 我们采用了rocketmq(https://github.com/alibaba/Rocke ...

  8. 剖析top命令显示的VIRT RES SHR值

    http://yalung929.blog.163.com/blog/static/203898225201212981731971/ http://www.fuzhijie.me/?p=741 引  ...

  9. linux进程内存到底怎么看 剖析top命令显示的VIRT RES SHR值

    引 言: top命令作为Linux下最常用的性能分析工具之一,可以监控.收集进程的CPU.IO.内存使用情况.比如我们可以通过top命令获得一个进程使用了多少虚拟内存(VIRT).物理内存(RES). ...

随机推荐

  1. Wpf窗口设置可拖动

    在窗口界面的一个控件(TopGrid)设置如下MouseLeftButtonDown事件即可 private void TopGrid_MouseLeftButtonDown(object sende ...

  2. vagrant 创建虚拟机时遇到问题

    问题1 :  ceph-node3: Warning: Authentication failure. Retrying.. 问题分析: ssh 认证失败,在向虚拟机拷贝内容时权限不足. 解决办法: ...

  3. jdk1.8 HashMap底层数据结构:深入解析为什么jdk1.8 HashMap的容量一定要是2的n次幂

    前言 1.本文根据jdk1.8源码来分析HashMap的容量取值问题: 2.本文有做 jdk1.8 HashMap.resize()扩容方法的源码解析:见下文“一.3.扩容:同样需要保证扩容后的容量是 ...

  4. 使用python画3D线条

    """用于验证整体趋势正确性""" #!python3 #-*- coding:utf-8 -*- import matplotlib as ...

  5. Spring1

    一.Spring是什么?有什么用? Spring的适用环境是这样的,假设现在有一个类port,它将提供一个返回消息的功能,代码如下: public class port { private weibo ...

  6. JavaWeb——Filter过滤器

    1.Filter的目的 Filter用于在Servlet之前检测和修改请求和响应,它可以拒绝.重定向或转发请求.常见的有这几种: 日志过滤器 使用过滤器记录请求,提供请求日志记录,还可以添加追踪信息用 ...

  7. Spring入门(六):条件化的bean

    1. 概念 默认情况下,Spring中定义的bean在应用程序启动时会全部装配,不管当前运行的是哪个环境(Dev,QA或者Prod),也不管当前运行的是什么系统(Windows或者Linux),但有些 ...

  8. WPF中TimeSpan的坑

    记一次在WPF中,在将格式为“DD.HH:mm:ss”字符串转换成TimeSpan时遇到的坑 如果字符串为:DD.HH:mm:ss,转换结果正确.例如: var currentValue = &quo ...

  9. pickle 基础用法

    def save_obj_to_file(path, target_obj): file = open(path,'wb') pickle.dump(target_obj) file.close() ...

  10. ts 学习笔记 - 泛型

    目录 泛型 举个栗子 泛型约束 多个参数时也可以在泛型约束中使用类型参数 泛型接口 泛型类 泛型参数的默认类型 泛型 泛型(Generics)是指在定义函数.接口或者类的时候, 不预先指定其类型,而是 ...