当前位置: 首页 > news >正文

mmap和ioremmap解析

文章目录

    • mmap
      • mmap函数详解
    • ioremap
    • 两者区别
    • 参考

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


http://www.mrgr.cn/news/46974.html

相关文章:

  • java 中 main 方法使用 KafkaConsumer 拉取 kafka 消息如何禁止输出 debug 日志
  • 认识机器学习中的经验风险最小化准则
  • WebGL性能检测
  • 【股票数据API接口05】如何获取股票最新分时MA数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • 在Jmeter中跨线程组传递变量(token)--设置全局变量
  • 数据结构与算法之链表: LeetCode 19. 删除链表的倒数第 N 个结点 (Ts版)
  • 揭秘地表水与地下水耦合的奥秘!基于QSWATMOD的SWAT-MODFLOW模拟
  • centos6.9不用安装光盘在控制台重置root密码
  • 安全工具 | 搭建带有 Web 仪表板的Interact.sh
  • 如何确保我的Java爬虫在获取Lazada商品详情时遵守API使用限制?
  • 前端的全栈之路:基于 Vue3 + Nest.js 全栈开发的后台应用
  • 美国亚马逊灯串UL588测试报告测试哪些内容
  • 知识付费对企业的帮助 知识付费的优势 知识服务服务 企业为什么一定要做知识付费
  • 【数据库】MySQL解决ONLY_FULL_GROUP_BY模式
  • 刷题 双指针 滑动窗口
  • 你能描述一下Java中的JDBC连接池吗?Java中的事务隔离级别有哪些?它们分别是什么?
  • 三菱FX5U-CCLINK IEFB网关HT3S-CIS-MDN读取七星华创CS310空气流量计数据应用案例
  • 骨传导耳机哪款好?2024年骨传导耳机推荐!好戴不伤耳~
  • 图像处理概述
  • PPT分享:埃森哲-业务流程BPM能力框架体系
  • 【学术会议征稿】第五届应用力学与机械工程国际学术会议(ICAMME 2024)
  • C++学习笔记(55)
  • fastadmin 多商户模式下侧边栏跳转路径BUG
  • Python - Modbus测试
  • 【Java异常】面试官问你Java中的异常,这篇就够了
  • 程序员在AI时代扮演着多重角色:不仅是AI技术的创造者,也是使用者,更是AIGC的贡献者