mmap

mmap详解 想写一篇文章,详细的介绍一下mmap,主要是原理、用法、mmap泄露来进行介绍。说到mmap,首先得从堆空间说起。 阅读详情


说明:内容来自APUE第2版中文版和相关函数的man手册。


Memory-mapped I/O

       存储映射I/O使一个磁盘文件与存储空间中的一个缓冲区相映射。对缓冲区的操作,相当于对文件的操作。从缓冲区取数据,相当于读文件中的相应文件;将数据写入缓冲区,则数据自动地写入文件。这样就可以在不使用read和write的情况下执行I/O。

mmap

       为了使用这一功能,应首先告诉内核将一个文件映射到一个存储区域中。这一任务由mmap函数实现,其函数原型与所在头文件如下:

#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
void *mmap64(void *addr, size_t length, int prot, int flags, int fd, off64_t offset);
// 成功,返回映射区域的起始地址;失败,返回MAP_FAILED[(void *) -1],并设置errno。

       mmap在虚拟地址空间中创建一个映射。
       函数mmap() 与函数 mmap64() 的区别在最后一个参数,可以使应用程序访问更大的文件。
       每个参数及含义如下:

参数描述
addr映射存储区的起始地址。
length存储区长度,单位:字节。
prot对映射存储区的保护要求。
flags确定映射的更新对映射相同区域的其他进程是否可见,以及是否对文件执行更新。
fd要映射文件的文件描述符。
offset要映射字节在文件中的起始偏移量。

       相关参数的详细信息:
       addr: 通常设置为0。

addr描述
0(NULL)由内核选择该映射区的起始地址。
非空若未设置MAP_FIXED,内核将此视作在何处开辟映射区的一个建议,并不一定使用它,Linux将在页边界附近创建映射。
若设置了MAP_FIXED,则在指定的位置开辟映射区。

       prot: 指定映射存储区的保护要求不能超过文件open模式访问权限,若文件是使用O_RDONLY打开的,那么对映射存储区就不能指定PROT_WRITE,否则,对映射区执行写操作时,将产生SIGSEGV信号,发生Segment Fault。prot的取值如下表,可取任意一个或任意组合的按位或。

prot描述
PROT_EXEC映射区可执行。
PROT_READ映射区可读。
PROT_WRITE映射区可写。
PROT_NONE映射区不可访问。

       flags: 其值通常为MAP_SHARED。其他常用值如下表:

flags描述
MAP_SHARED共享存储区。存储操作将修改映射文件,即此映射区的存储操作相当于对该文件的写操作。
调用msync() 或 munmap()之前,文件可能并未被更新。
MAP_PRIVATE对映射区的存储操作导致创建该映射文件的一个私有副本。(Create a private copy-on-write mapping.)
所有后来对该映射区的引用都是引用该副本,而不是原始文件。
MAP_FIXED返回值必须等于addr,即在指定的addr处开辟映射区。移植性差,不鼓励使用此标志。

       还有其他的一些标志,详见mmap手册。

MAP_SHARED和MAP_PRIVATE是POSIX所要求的。在遵循POSIX的系统中,对MAP_FIXED的支持是可选的,遵循XSI的系统则要求支持此标志。

       addr 和 offset通常应该是系统虚拟页长度的倍数。虚拟页长可使用带参数 _SC_PAGESIZE 或 _SC_PAGE_SIZE 的 sysconf 函数获取。addr 和 offset 通常设置为0,所以这种要求一般并不重要。


mprotect

       创建映射存储区后,其保护权限可以通过 mprotect() 函数来更改。其原型如下:

int mprotect(const void *addr, size_t len, int prot);
// 成功,返回0;失败,返回-1,并设置errno。

       参数及意义同函数 mmap() 。


msync

       此函数可以将映射存储区中被修改的内容冲洗到被映射的文件中。其原型如下:

int msync(void *addr, size_t length, int flags);
// 成功,返回0;失败,返回-1,并设置errno。

       如果映射是私有的,那么不修改被映射的文件。
       flags参数使我们对如何冲洗存储区有某种程度的控制。其可用取值如下:

flags描述
MS_ASYNC设定了更新计划,函数调用立即返回。简化被写页的调度。
MS_SYNC在此函数返回前等待写操作完成。
MS_INVALIDATE可选项。要求使同一文件的其他映射无效。

       可以使用按位或的方式使用这些值,但不能同时指定 MS_ASYNC 与 MS_SYNC 。


munmap

       要解除映射,一是终止进程,二是调用 munmap() 函数,关闭文件描述符并不解除映射区。munmap() 函数的原型如下:

int munmap(void *addr, size_t length);
// 成功,返回0;失败,返回-1,并设置errno。

       相关示例可以查看mmap的手册。


       将一个普通文件复制到另一个普通文件中时,存储映射I/O比较快。但是有一些限制,例如,不能用其在某些设备(如网络设备或终端设备)之间进行复制,并且在对被复制的文件进行映射后,也要注意该文件的长度是否改变。尽管如此,某些应用程序会从存储映射I/O得到好处,因为它处理的是存储空间而不是读、写一个文件,所以常常可以简化算法。从存储映射I/O中得益的一个例子是对帧缓冲区设备的操作,该设备引用一个位图式显示(bitmapped display)。

mmap是什么,为什么? 这一段搞文件系统的索引的事情,因为使用的copy from user 和copy to user等方式,进行核内核外数据交换,效率较低。例如,对于使用O_DIRECT方式的写操作,因为要加索引,所以刚开始原始数据在iovec中,但是内核态并不能对它修改。需要先复制到内核空间,然后改完之后,复制回用户空间,来回复制太麻烦了。考虑到效率问题,开始研究mmap这种方式,最起码它不需要再核内核外进行交换了,最少是少了一次复制。 mmap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进 阅读详情

相关推荐

Spring Cloud 整合(一) CRUD

Springcloud 整合之 CRUDSpringcloud介绍功能概述为什么要选用Springcloud Springcloud介绍 功能概述 实现微服务 Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。 为什么要选用Springcloud

Kerwin-Lin的博客 1501

mmap—存储映射I/O

1.基本概念 存储映射I/O(memory-mapped I/O)能将一个磁盘文件映射到存储空间中的一个缓冲区上。 于是,当从缓冲区中取数据是,就相当于读文件中的相应字节。与此类似,将数据存入缓冲区时,相应字节就自动写入文件。这样就可以在不使用read和write的情况下执行I/O。 为实现该功能,应首先告诉内核将一个给定的文件映射到一个存储区域中。 原理如下: 2.mmap函数完成该功能 该函数参数较多 首先对于内存而言: addr参数,用于指定映射存储区的起始地址。通.

weixin_61631200的博客 1538

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置指南配置JAVA配置mooctest配置ChromeDriver配置SeleniumSelenium的使用 环境配置指南 配置JAVA 首先进入JDK8官方安装地址 然后找到Windows 64位 jdk8 点击下载(这里下载需要登录Orcale 账户) 下载后JDK的安装根据提示进行,还有安装JDK的时候也会安装JRE,一并安装就可以了。 安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为 D:\java\jav

Kennen0_0的博客 9606

存储映射I/O

一个进程拥有独立并且连续虚拟地址空间,在32位体系结构中进程的地址空间是4G。不过,内核在管理进程的地址空间时是以内存区域为单位。内存区域是进程整个地址空间中一个独立的内存范围,它在内核中使用vm_area_struct数据结构来描述。每个内存区域都有自己访问权限以及操作函数,因此进程只能对有效范围的内存地址进行访问。 存储映射I/O是一种基于内存区域的高级I/O操作,它将磁盘文件与进程地址空间

Glory的专栏 5367

三模冗余设计

在数字电路设计中,Voter模块(表决器) 和 三模冗余(Triple Modular Redundancy, TMR) 是高可靠性系统的核心设计技术,主要用于容错和抗辐射(如航天、医疗设备等关键领域)。容错机制:若任一模块故障(如SEU,单粒子翻转),其他两个模块仍能保证正确输出。功耗与面积:TMR会显著增加资源占用(约3倍),需权衡可靠性和成本。航天电子:抗辐射芯片(如FPGA)中用于防止单粒子翻转(SEU)。故障检测:可扩展设计以检测并隔离故障模块(如通过BIST)。

qq_45776815的博客 2050

【开源数据集】电动车佩戴头盔检测数据集(TWHD)

佩戴头盔检测数据集VOC格式图像与标注数量各5448张

hzg19930513的博客 5164

内存映射(Memory-mapped I/O)实现进程间通信和文件拷贝

内存映射(Memory-mapped I/O)是将中的数据中,用户通过修改内存就能够修改磁盘文件。使用实现进程之间的通信,1和2表示进程的,这两个进程与同一个磁盘文件建立联系既可以实现两个进程之间的通信。

鹏鱼彦的博客 1999

开源Agent Skill让AI画图不再翻车:从数据到专业图表全流程

在人工智能与数据可视化交叉领域,让模型直接生成图表往往伴随字体乱码、坐标轴密集、配色失调等高频问题。Agent Skill作为一种可复用的能力封装机制,将专业绘图流程固化为标准化操作手册,从数据特征识别、图表类型决策到代码生成与渲染校验形成完整闭环。它不再依赖临时提示词的一次性发挥,而是让AI按领域专家的思维执行任务,显著提升出图质量与稳定性。这种能力在数据分析报告、运营日报、论文插图等场景具有广泛实用价值,尤其适用于需要快速产出规范化图表的工作流。本文即从这一技术范式出发,介绍一个GitHub上获得2.5

weixin_33851429的博客 931

内存映射I/O与端口映射I/O的区别

CPU与设备的控制寄存器和数据缓冲区进行通信,控制器中寄存器的两种编址方案 PMIO(Port-mapped I/O端口映射I/O ): 内存和I/O设备有各自的地址空间。每个控制寄存器被分配一个I/O端口号,这是一个8位或16位的整数。所有I/O端口形成I/O端口空间。端口映射I/O通常使用一种特殊的CPU指令,专门执行I/O操作。在Intel的微处理器中,使用的指令是IN和OUT。这些指令可以读/写1,2,4个字节(例如:outb, outw, outl)从/到IO设备上。I/O设备有一个与内存不同的

qq_43606914的博客 5208

Cadence AMS数模混合仿真:从零搭建高效验证环境的实战指南

本文是Cadence AMS数模混合仿真的实战指南,详细介绍了如何从零搭建高效的芯片验证环境。内容涵盖环境准备、Testbench创建、核心Config视图与ADE设置、仿真运行调试及性能加速技巧,旨在帮助工程师解决SoC设计中数字与模拟模块的集成验证难题,确保芯片设计一次成功。

weixin_29164091的博客 320

解决PADs VX2.7安装中的License失效与软件卡死问题

本文详细解析了PADs VX2.7安装过程中常见的License失效与软件卡死问题,提供了从破解工具选择、环境变量设置到输入法兼容性调整等实用解决方案。特别推荐使用Siemens EDA系列新版破解工具,并分享性能调优与定期维护技巧,帮助工程师高效解决安装难题。

weixin_29234239的博客 813

存储映射I/O(一)

一、存储映射I/O 存储映射I/O使一个磁盘文件与存储空间中的一个缓冲区映射,于是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件,这样,就可在不不适用read和write函数的情况下,使用地址(指针)完成I/O操作。 使用这种方法,首先应通知内核,将一个指定文件映射到存储区域中,这个映射工作可以通过mmap函数来实现。 二、主要应...

月雲之霄的博客 965

白皮精读:70页 2025 基于数据空间的金融数据可信流通研究报告【附全文阅读】

金融数据可信流通面临法规、技术与商业模式的挑战。报告分析国内外发展现状,提出基于数据空间的可信流通框架,包含典型场景、技术方案与流通模式。实践案例显示,隐私计算、区块链等技术可提升风控效率与合规性。建议完善数据分类分级、统一技术标准并推动行业试点,以释放数据要素价值,促进数字经济发展。

cdfunlove的博客 847

mmap原理之详解

本文转自:http://www.cnblogs.com/huxiao-tee/p/4660352.html(一)mmap基础概念mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而

qq_36675830的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Linux下mmap

什么是mmap了?从名字上来看是memory map也就是地址映射,是一种内存映射文件的方法。mmap是一个可以将一个文件或者其它对象映射到进程的地址空间实现磁盘的地址和进程虚拟地址空间一段虚拟地址的一一对应关系。通过mmap这个系统调用我们可以让进程之间通过映射到同一个普通文件实现共享内存,普通文件被映射到进程地址空间当中之后,进程可以向访问普通内存一样对文件进行一系列操作。

qq_56999918的博客 8077

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

mmap函数概述

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

weixin_49298931的博客 5491

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Linux mmap原理

mmap是linux操作系统提供给用户空间调用的内存映射函数,很多人仅仅只是知道可以通过mmap完成进程间的内存共享和减少用户态到内核态的数据拷贝次数,但是并没有深入理解mmap在操作系统内部是如何实现的,原理是什么。linux段页式内存管理回顾mmap原理(一)进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域。

m0_53157173的博客 3411

Android mmap分析

对文件的读取操作跨过了页缓存,减少了数据的拷贝次数,用内存读写取代I/O读写,提高了文件读取效率。实现了用户空间和内核空间的高效交互方式。两空间的各自修改操作可以直接反映在映射的区域内,从而被对方空间及时捕捉。提供进程间共享内存及相互通信的方式。不管是父子进程还是无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域。从而通过各自对映射区域的改动,达到进程间通信和进程间共享的目的。同时,如果进程A和进程B都映射了区域C,当A第一次读取C时通过缺页从磁盘复制文件页到内存中;

轻口味的专栏 2188

什么是 mmap

换言之,CPU 进行一次磁盘读写操作涉及的数据量至少是 4KB,但是进行一次内存操作涉及的数据量是基于地址的,也就是通常的 64bit(64 位操作系统)。mmap 受限于操作系统内存大小:例如在 32-bits 的操作系统上,虚拟内存总大小也就 2GB,但由于 mmap 必须要在内存中找到一块连续的地址块,此时你就无法对 4GB 大小的文件完全进行 mmap,在这种情况下你必须分多块分别进行 mmap,但是此时地址内存地址已经不再连续,使用 mmap 的意义大打折扣,而且引入了额外的复杂性;

一缕阳光的博客 1万+

【Linux】mmap文件映射

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

2301_80224556的博客 1465

Linux下对mmap封装使用

mmap即memory map,是一种内存映射文件的技术。mmap可以将一个文件或者其它对象映射到进程的地址空间,进而实现磁盘地址和进程虚拟地址的一一对应关系。通过使用mmap技术,我们可以让不同进程通过映射到同一个普通文件的方式实现共享内存,普通文件被映射到进程地址空间当中之后,进程可以向访问普通内存一样对文件高效地进行一系列操作。mmap()必须以PAGE_SIZE(默认为4KB) 为单位进行映射,而内存也只能以页为单位进行映射,若要映射非PAGE_SIZE整数倍的地址范围,要先进行内存对齐,强行以。

游戏行业资深搬砖人员 2835

mmap java_Java中mmap的使用

什么是mmapJava中mmap的使用,具体参考kafka源码中的OffsetIndex这个类操作文件,就相当于操作一个ByteBuffer一样public class TestMmap {public static String path = "C:\\Users\\64371\\Desktop\\mmap";public static void main(String[] args) thro...

weixin_29447313的博客 2653

【mmap】深度分析mmap:是什么 为什么 怎么用 性能总结

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

我的笔记本 2345

mmap。

linux mmap 内存映射 mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2()。系统调用mmap()可以将某文件映射至内存(进程空间),如此可以把对文件的操作转为对内存的操作,以此避免更多的lseek()与read()、write()操作,这点对于大文件或者频繁访问的文件而言尤其受益。但有一点必须清

ryder001的专栏 1万+
上一篇: 删除windows目录中所占空间为0的文件
下一篇: C++11 override
linuxwuj
博客等级 码龄16年 25粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值