`

mmap详解

 
阅读更多

http://blog.chinaunix.net/uid-26669729-id-3077015.html

http://my.oschina.net/orion/blog/32218

 

mmap将一个文件或者其它对象映射进内存(把内核分配的物理内存遇到到进程的用户地址空间)。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。

当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.但需注意,直接对该段内存写时不会写入超过当前文件大小的内容.

采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。  

 

用户空间存取内核空间,具体的实现方法要从两个方面考虑,先是用户进程,需要调用mmap来将自己的一段虚拟空间映射到内核态分配的物理内存;然后内核空间需要重新设置用户进程的这段虚拟内存的页表,使它的物理地址指向对应的物理内存。针对linux内核的几种不同的内存分配方式(kmalloc、vmalloc和ioremap),需要进行不同的处理。

当用户调用mmap的时候,内核进行如下的处理: 
1. 先在进程的虚拟空间查找一块VMA; 
2、将这块VMA去映射  
3、如果设备驱动程序或者文件系统的file_operations定义了mmap操作,则调用它 
4、将这个VMA插入到进程的VMA链中  
file_operations的中定义的mmap方法原型如下: 
int (*mmap) (struct file *, struct vm_area_struct *);  
其中file是虚拟空间映射到的文件结构,vm_area_struct就是步骤1中找到的VMA。、

 

内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,相反,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<---->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。

        首先,驱动程序(内核)先分配好一段内存,接着用户进程通过库函数mmap()来告诉内核要将多大的内存映射到内核空间,内核经过一系列函数调用后调用对应的驱动程序的file_operation中的mmap函数,在该函数中调用remap_pfn_range()来建立映射关系。直白一点就是:驱动程序在mmap()中利用remap_pfn_range()函数将内核空间的一段内存与用户空间的一段内存建立映射关系。

 

一. 传统文件访问

UNIX访问文件的传统方法是用open打开它们, 如果有多个进程访问同一个文件, 则每一个进程在自己的地址空间都包含有该文件的副本,这不必要地浪费了存储空间. 下图说明了两个进程同时读一个文件的同一页的情形. 系统要将该页从磁盘读到高速缓冲区中, 每个进程再执行一个存储器内的复制操作将数据从高速缓冲区读到自己的地址空间.

 

 

存储映射

现在考虑另一种处理方法: 进程A和进程B都将该页映射到自己的地址空间, 当进程A第一次访问该页中的数据时, 它生成一个缺页中断. 内核此时读入这一页到内存并更新页表使之指向它.以后, 当进程B访问同一页面而出现缺页中断时, 该页已经在内存, 内核只需要将进程B的页表登记项指向次页即可. 如下图所示: 

分享到:
评论

相关推荐

    linux下的内存映射函数mmap详解及示例代码.pdf

    linux下的内存映射函数mmap详解及示例代码.pdf

    linux下的内存映射函数mmap详解及示例代码.doc

    linux下的内存映射函数mmap详解及示例代码.doc

    linux下的内存映射函数mmap详解及示例代码

    介绍应用使用mmap以及到kernel内部的映射实现过程以及实例代码

    C语言详解.mmap

    C语言 要点汇总

    第三章:类的加载过程(类的生命周期)详解.mmap

    第三章:类的加载过程(类的生命周期)详解.mmap

    (一)Socket编程.mmap

    用思维导图的方式总结了Socket的原理和一些应用资源,需要使用MindManage打开。

    m_map用法详解.rar_M map_m_map_m_map sst_matlab世界地图_世界地图 MATLAB

    m_map使用方法详细介绍,采用matlab下载世界地图,可以获取海岸线等数据库

    Python进程间通信之共享内存详解

    查了一下,Python中可以使用mmap模块来实现这一功能。 Python中的mmap模块是通过映射同一个普通文件实现共享内存的。文件被映射到进程地址空间后,进程可以像访问内存一样对文件进行访问。 不过,mmap在linux和...

    python模块详解

    python模块详解 各个模块的详解 核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. exceptions 模块 1.4. os 模块 1.5. os.path 模块 1.6. stat 模块 1.7. string 模块 1.8. re 模块 1.9. math 模块 1.10....

    linux用户进程内存映射

    详解mmap、malloc在内核态的实现,原理是什么,有详细的描述和加的内核源码注释,可完全理解用户进程申请内存是怎么一回事

    EPOLL模型详解

    epoll的优点 支持一个进程打开大数 目的socket描述符(FD) select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。...使用mmap加速内核 与用户空间的消息传递。

    linux设备驱动程序第三版

    1. Linux 设备驱动第三版 .................................................................................................................... 5 2. 第 1 章 设备驱动简介 ....................................

    PHP APC的安装与使用详解

    一、PHPAPC安装下载与解压安装包:复制代码 代码如下:wget-c ...apc –enable-mmap –enable-apc-spinlocks–disable-apc-pthreadmutex–with-php-config=/usr/lo

    nginx中共享内存的使用详解

    ngx_shmem.c/h文件只是对mmap()/munmap()系统调用或者shmget()/shmdt()的一个很简单的封装。实现了ngx风格的基础库,可以申请和释放一段连续的共享内存空间。一般用于固定长度的共享数据使用,使用过程中数据长度...

    LINUX设备驱动第三版_588及代码.rar

    mmap设备操作 执行直接I/O访问 直接内存访问 快速参考 第十六章 块设备驱动程序 注册 块设备操作 请求处理 其他一些细节 快速参考 第十七章 网络驱动程序 snull设计 连接到内核 net_device结构细节 ...

    arm64-mydoc:arm64内核调度抢占进程创建的原理源码详解

    思维导图:mmap一个文件(从文件-&gt; va的建立)–&gt;访问该文件发生pagefault(从va获取pa并建立页表)的流程分析。 1怎么获取va 1.1内核态 内核va / pa是固定的,va就是0 – 1G地址空间,因此TTBR1_EL1的值对于所有...

    Linux DeviceDrivers 3rd Edition

    mmap设备操作 418 执行直接I/O访问 429 直接内存访问 435 快速参考 453 第十六章 块设备驱动程序 458 注册 459 块设备操作 464 请求处理 468 其他一些细节 484 快速参考 487 第十七章 网络驱动程序 491 ...

    Linux高性能服务器编程

    高级IO函数 6.1 pipe函数 6.2 dup函数和dup2函数 6.3 readv函数和writev函数 6.4 sendfile函数 6.5 mmap函数和munmap函数 6.6 splice函数 6.7 tee函数 6.8 fcntl函数 第7章 Linux服务器程序规范 7.1 日志 ...

    宋劲彬的嵌入式C语言一站式编程

    8. mmap 29. 文件系统 1. 引言 2. ext2文件系统 2.1. 总体存储布局 2.2. 实例剖析 2.3. 数据块寻址 2.4. 文件和目录操作的系统函数 3. VFS 3.1. 内核数据结构 3.2. dup和dup2函数 30. 进程 1. 引言 2. 环境变量 3. ...

Global site tag (gtag.js) - Google Analytics