mmap使得可以将设备内存映射到用户空间,从而使得用户程序获得访问硬件的能力,mmap的动作需要由内核中的驱动来实现。在使用mmap映射后,用户程序对给定范围的内存的读写就变成了对设备内存的读写,也就是在访问设备了。

并不是所有的硬件都支持mmap,比如串口设备就不支持mmap。mmap存在一个限制,就是它映射的粒度为PAGE_SIZE,因而内核只能在页表一级对虚拟内存地址进行管理,因而使用mmap将设备内存映射到用户进程的虚拟内存空间时必须以页为单位,并且内核被映射的物理地址也必须起始于PAGE_SIZE的整数倍,即被映射的物理地址的起始地址必须对齐到PAGE_SIZE上。

---------------------

作者:goodluckwhh

来源:CSDN

原文:https://blog.csdn.net/goodluckwhh/article/details/16870101

版权声明:本文为博主原创文章,转载请附上博文链接!

但 mmap方式只适用于更新、读写一块固定大小的文件区域而不能做像诸如不断的写内容进入文件导到文件增长这类的事。

https://blog.csdn.net/qq100440110/article/details/52104311

在一般的文件读写中,会有两次数据拷贝,一次是从硬盘拷贝到操作系统内核,另一次是从操作系统内核拷贝到用户态的应用程序。而在内存映射文件中,一般情况下,只有一次拷贝,且内存分配在操作系统内核,应用程序访问的就是操作系统的内核内存空间,这显然要比普通的读写效率更高。

内存映射文件的另一个重要特点是,它可以被多个不同的应用程序共享,多个程序可以映射同一个文件,映射到同一块内存区域,一个程序对内存的修改,可以让其他程序也看到,这使得它特别适合用于不同应用程序之间的通信。比普通的基于loopback接口的Socket要快10倍。

简单总结下,对于一般的文件读写不需要使用内存映射文件,但如果处理的是大文件,要求极高的读写效率,比如数据库系统或繁忙的电子交易系统,或者需要在不同程序间进行共享和通信,那就可以考虑内存映射文件。

05-11 14:03