自学内容网 自学内容网

mmap和ioremmap解析

mmap

mmap 即 memory map,也就是内存映射。

mmap 是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用 read、write 等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如下图所示:

在这里插入图片描述在这里插入图片描述
常规文件操作需要从磁盘到页缓存再到用户主存的两次数据拷贝。而mmap操控文件,只需要从磁盘到用户主存的一次数据拷贝过程。说白了,mmap的关键点是实现了用户空间和内核空间的数据直接交互而省去了空间不同数据不通的繁琐过程。因此mmap效率更高

作用

  1. 将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能
  2. 将特殊文件进行匿名内存映射,可以为关联进程提供共享内存空间

mmap函数详解

#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

参数

  • addr:映射的起始地址,一般为NULL,让内核自动选择。
  • length:映射的长度,可以是文件的长度或者是页的整数倍。
  • prot:内存保护标志,用于指定内存的保护方式,如读、写、执行等。
  • flags:控制映射的标志,如映射是共享的还是私有的。
  • fd:打开的文件描述符,指定要映射的文件。
  • offset:文件映射的偏移量,指定映射文件开始的位置。

参数的重点介绍:
addr:
如果addr为NULL,内核会自动选择一个起始地址作为映射的起点。
如果addr不为NULL,则内核会尝试将映射放置在指定的起始地址处。如果指定的地址无效或与已有映射冲突,则mmap()调用会失败。
通常情况下,最常用的做法是将addr设置为NULL,由内核选择一个适当的地址。

length:
length参数指定要映射的长度,可以是文件的长度或者是页的整数倍。对于文件映射,length一般为文件大小。
对齐到页面大小可以获得最佳性能,因为页面是内存管理的最小单位。

prot:
prot参数指定内存的保护标志,用于指定内存的访问权限。常见的标志有PROT_READ(可读)、PROT_WRITE(可写)和PROT_EXEC(可执行)。
这些标志可以按位或运算进行组合,以指定多个访问权限,比如 PROT_WRITE | PROT_READ
在这里插入图片描述

flags:
flags参数用于控制映射的标志,用于指定映射是共享的还是私有的,以及一些其他的映射特性。
常见的标志有MAP_SHARED(共享映射)和MAP_PRIVATE(私有映射)。
享映射允许多个进程对映射进行读写操作,而私有映射则会对映射的页进行复制,每个进程都有自己的私有拷贝。
在这里插入图片描述

fd:
fd参数是打开的文件描述符,用于指定要映射的文件。
如果fd为-1,则表示创建一个匿名映射(anonymous mapping),不与任何文件关联,而是在内存中分配一段连续的空间。
匿名映射通常用于进程间的共享内存或者用作临时存储空间。

offset:
offset参数指定从文件的哪个位置开始进行映射。一般情况下,可以将offset设置为0,表示从文件的开头位置开始映射。
offset必须是页面大小的整数倍。

mmap函数只是完成建立mmap虚拟内存空间与文件的地址映射,并没有进行数据拷贝

ioremap

两者区别

1、两者都是内存映射的函数
2、ioreamap()使用在内核里,将设备所在的物理地址映射到内核虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址。
3、mmap()用在用户空间,将将设备所在的物理地址映射到用户虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址。
4、如果要操作设备的物理地址,有两种办法,
一种是使用ioreamap(),然后用户调用read,write,ioctrl系统调用去访问那块物理地址,这里涉及到了两次拷贝,一次是用户空间到内核空间的拷贝,一次是内核空间到物理地址的拷贝;
第二种是使用mmap(),这样可以只用到一次拷贝,可以直接从用户空间拷贝数据至物理地址。

参考

https://blog.csdn.net/W__winter/article/details/131571742
https://blog.csdn.net/weixin_45560665/article/details/137245990
https://blog.csdn.net/mxgsgtc/article/details/128323968
https://zhuanlan.zhihu.com/p/691717824


原文地址:https://blog.csdn.net/chongbin007/article/details/140552884

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!