mmap映射实战举例

Linux 内核之 mmap 内存映射的原理及源码解析 mmap 的全称是 memory map,中文意思是内存映射或地址映射,是 Linux 操作系统中的一种系统调用,其作用是将一个文件或者其它对象映射到进程的虚拟地址空间,实现磁盘地址和进程虚拟地址空间一段虚拟地址的一一对应关系。通过 mmap 系统调用我们可以让进程之间通过映射到同一个普通文件实现共享内存,普通文件被映射到进程虚拟地址空间当中后,进程可以像访问普通内存一样对文件进行一系列操作,而不需要通过 I/O 系统调用来读取或写入。 阅读详情

mmap映射实战举例

需求:在Linux环境下,需要打开一个文件,然后映射到内存中,接着在特定的地址偏移处写入内容,并且在此之前需要清空该位置的内容并填充为ff,写完再做校验。

步骤:

  1. 打开文件:使用open()函数打开文件。
  2. 内存映射:使用mmap()函数将文件映射到内存中。
  3. 清空并填充:使用指针操作和memset()函数来清空并填充特定区域。
  4. 写入内容:将需要写入的内容通过指针写入到映射的内存区域。
  5. 同步内存映射:使用msync()函数确保内存中的数据写回到文件。
  6. 校验内容:使用memcmp()函数比较写入内容是否正确。
  7. 取消映射:使用munmap()函数取消映射。
  8. 关闭文件:使用close()函数关闭文件。
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    // 打开文件
    int fd = open("wuyanzu.txt", O_RDWR);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    // 获取文件大小
    struct stat sb;
    if (fstat(fd, &sb) == -1) {
        perror("fstat");
        exit(EXIT_FAILURE);
    }

    // 内存映射文件
    void *mapped_area = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (mapped_area == MAP_FAILED) {
        perror("mmap");
        exit(EXIT_FAILURE);
    }

    // 指定的偏移量和大小
    off_t offset = 1024; // 举例的偏移量
    size_t size_to_fill = 512; // 举例的填充大小

    // 清空并填充为ff
    memset((char *)mapped_area + offset, 0xff, size_to_fill);

    // 写入内容到指定偏移量的位置
    // 假设我们有一个字符数组作为示例内容
    char content[] = "Hello, World!";
    memcpy((char *)mapped_area + offset, content, sizeof(content));

    // 将内存中的数据同步到磁盘上
    if (msync(mapped_area, sb.st_size, MS_SYNC) == -1) {
        perror("msync");
        munmap(mapped_area, sb.st_size);
        exit(EXIT_FAILURE);
    }
	
    //校验
    if(memcmp((char *)mapped_area + offset, content, sizeof(content)) != 0)
    {
        perror("memcmp");
        munmap(mapped_area, sb.st_size);
        exit(EXIT_FAILURE);
    }
    
    // 取消映射
    if (munmap(mapped_area, sb.st_size) == -1) {
        perror("munmap");
        exit(EXIT_FAILURE);
    }

    // 关闭文件
    if (close(fd) == -1) {
        perror("close");
        exit(EXIT_FAILURE);
    }

    return 0;
}
C/C++ mmap 内存映射 void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); start:映射区的开始地址 length:映射区的长度 prot:期望的内存保护标志,不能与文件的打开模式冲突。 flags:指定映射对象的类型,映射选项和映射页是否可以共享。 fd:有效的文件描述词。如果MAP_ANONYMO... 阅读详情

相关推荐

mmap 创建共享内存映射

mmap 创建共享内存映射

challenglistic的博客 2623

mmap详细解析及式例

资料 认真分析mmap:是什么 为什么 怎么用 mmap想关 mmap基础概念 mmap内存映射原理 o一、进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域 1. 进程在用户空间调用库函数mmap,原型 : void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); 2. 在当前进程的虚拟地址空间中,寻找一段空闲的满足要求的连续的虚拟地址 3. 为此虚拟区分配一个vm_area_s

AdrianAndroid的专栏 1683

Linux系统 mmap 存储映射

括号中表示预期行为,括号外部的表示在LINUX系统中的实际行为,比如组合SHARED/EXEC的读行为,对于一个可执行的共享地址来说,没有给与PROT_READ属性,预期当然不可读,但是由于CPU执行上面的代码,必须要进行读操作,而实际的硬件架构和及并没有区分执行读和其它方式的读,所以,实际上对于这样的内存,仍然是可读的。从上图中可以看到,这段匿名区域(可能是MMAP区域,现在的MALLOC都用MMAP实现)地址是向下增长的,像栈一样,就像前面提到的第二种情况,这是在哪里控制的呢?

tugouxp的专栏 2470

mmap函数的用法详解及实例分析

1、mmap函数是一个比较神奇的函数,它可以把文件映射到进程的虚拟内存空间。通过对这段内存的读取和修改,可以实现对文件的读取和修改,而不需要用read和write函数。如下图所示,为mmap实现原理的示意图。 在这个图中,off为映射的部分在文件中的偏移量,len为映射的长度。 2、下面我们来看一下mmap函数的原型 void *mmap(void *addr, size_t len,...

bigmarshal的博客 2万+

Java 中的内存映射Mmap

Java 中原生读写方式大概可以被分为三种:普通 IO,FileChannel(文件通道),mmap(内存映射)。区分他们也很简单,例如 FileWriter,FileReader 存在于 java.io 中,他们属于普通 IO;FileChannel 存在于 java.nio 中,也是 Java 最常用的文件操作类;而今天的主角 mmap,则是由 FileChannel 调用 map 方法衍生出来的一种特殊读写文件的方式,被称之为内存映射。

weixin_43480441的博客 2948

Linux mmap内存映射

四、网上测试实例 (1)demo1 演示一下,将文件/tmp/file_mmap中的字符转成大写,分别使用mmap与read/write二种方法实现。 先创建/tmp/file_mmap文件,该文件写入www.baidu.com,使用strace统计系统调用。 /* @file: t_mmap.c */ #include <stdio.h> #include <ctype.h> #include <sys/mman.h> /mmap munmap/ #include &

uu_5201314的博客 2887

Linux环境进程间通信: 共享内存

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

吾欲乘风 2015

OpenBullet2 学习研究2-Conditions条件之KeyCheck的使用

上一节我们学习了如何安装Openbullet2以及如何新建一个配置,最后我们再配置里面新建一个Http的请求块,帮助我们发送了第一个请请求。这一节我们来学习check块。当我们发送请求以后,请求返回的内容是否是我们想要的,或者请求发送正确没有,这个我们怎么判断呢?这个时候就要用到check块了。

959

mmap函数用法及示例程序

UNIX网络编程第二卷进程间通信对mmap函数进行了说明。该函数主要用途有三个:1、将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能;2、将特殊文件进行匿名内存映射,可以为关联进程提供共享内存空间;3、为无关联的进程提供共享内存空间,一般也是将一个普通文件映射到内存中。头文件:   #include

nancygreen的专栏 1万+

瑞萨芯片串口配置,基于RL78芯片的串口使用配置

在这里隆重给大家介绍瑞萨编辑器CS+ for CA 的自动生成代码功能,只需要配置几个参数,就可以得到你想要的串口配置了,我现在已经忘记怎么手动配置寄存器了,哈哈。选择设置,此时将端口设置成功接下来设置时钟,根据自己的芯片所需设置相应的时钟,自己芯片是什么时钟查看数据手册和原理图可以找到。瑞萨芯片的串口配置其实和ST芯片的串口配置差不多,只是ST芯片的中文数据手册比较多,就更好配置了,找到所需要的串口配置IO口,此时将UART0 配置为引脚P61和P62,瑞萨芯片的串口配置竟然要配置串口。

qq_45315904的博客 4302

GaN功率放大器设计避坑指南:从仿真到实测的Doherty PA完整流程(基于ADS 2023)

本文详细介绍了基于ADS 2023软件,从理论计算、电路仿真到版图后仿真的GaN Doherty功率放大器完整设计流程。文章聚焦C波段应用,深入剖析了负载调制网络设计、稳定性处理、版图电磁仿真等关键环节中的常见误区与工程折衷,为工程师提供了一套从设计到实测的实战避坑指南。

weixin_29238147的博客 530

mmap 基本使用

​ mmap主要用来做内存映射的,可以将虚拟内存和磁盘上的文件直接映射。正常来说我们在写文件读文件的时候是需要使用系统调用api来进行,比如说read/write,这两个系统调用读写文件的方式是需要进行两次拷贝的,从用户空间拷贝到内核空间,然后从内核空间再拷贝到磁盘,而mmap将文件的地址直接映射到虚拟内存,这样,我们直接往这个地址读/写内容,可以像操作malloc申请出来的空间地址一样,写到这个地址,内容就直接在文件中了,减少了一次拷贝,提高了效率。这样一个公共的内存区域,也可以用来进程间

优快云NETVIP的博客 1万+

拜耳阵列(Bayer Pattern)和解马赛克简介

拜尔阵列由柯达的布莱斯·拜尔发明,拜尔阵列将更多的像素用于绿色,而不是红色和蓝色,因为人眼对绿色更敏感。但这张照片,每个像素只有rgb中的一种颜色,每个像素还缺少其它两个颜色分量,效果如下图3所示。典型的图像传感器(例如我们在数码相机中使用的图像传感器,主要有CCD, CMOS)由许多单独的光电传感器组成,所有这些传感器都会捕获光线。如果想要获得不同颜色的光,最直接的做法是加入不同颜色的滤镜,从而滤出 RGB 三个通道的颜色。这个覆盖层可以理解为一个过滤层,每种类型的过滤器通常只允许一种颜色的光线的通过。

qq_34999565的博客 5982

mmap 文件映射

详细讲解了 Linux 系统中 mmap 函数的用法。提供了使用 mmap 进行文件读写的示例代码,并展示了如何通过 mmap 实现类似 malloc 的内存分配。此外,还解释了如何使用 GDB 查看内存映射,并探讨了进程地址空间与文件的关联方式。

You build it, you run it 2078

YOLOv11多模态融合实战:基于YOLOFuse的RGB与红外线(IR)协同检测技术解析

本文深入解析了YOLOv11多模态融合技术,重点介绍基于YOLOFuse框架的RGB与红外线(IR)协同检测方法。通过动态权重分配、跨模态特征对齐等创新设计,实现在低光照等复杂环境下的高精度目标检测,mAP提升高达37%。文章包含实战案例、训练技巧和部署方案,为计算机视觉开发者提供完整的多模态融合解决方案。

weixin_29038345的博客 292

华中科技大学 计算机组成原理 educoder Logisim平台 计算机数据表示实验

本文主要是对 计算机数据表示实验的笔记和相关Logisim平台的图,供大家学习交流使用。 需要源文件或者源代码,可以留言评论! 目录实验目的第1关:汉字国标码转区位码实验第2关:汉字机内码获取实验第3关:偶校验编码设计第4关:偶校验解码电路设计第5关:16位海明编码电路设计第6关:16位海明解码电路设计第7关:海明编码流水传输实验第8关:16位CRC并行编解码电路设计第9关:CRC编码流水传输实验实验结果: 实验目的 本实训将帮助同学们巩固对计算机中数据表示方法的理解,要求能设计汉字国标码与区位码之间的转换

weixin_48383580的博客 2万+

【Linux】mmap文件内存映射

【Linux】mmap文件内存映射:一文带你理解mmap的映射,教你使用mmap,写入映射,读入映射,简单模拟实现malloc

tan_run的博客 3394

【NVIDIA】Jetson Orin Nano系列:编译外部驱动(交叉编译和板上编译)

Orin Nano外部驱动的开发入门,以hello world为例。使用交叉编译和板上编译两种方法

郭老二 1734

内存映射mmap技术详解

前面讲过,建立内存映射并没有实际拷贝数据,这时,MMU在地址映射表中是无法找到与ptr相对应的物理地址的,也就是MMU失败,将产生一个缺页中断,缺页中断的中断响应函数会在swap中寻找相对应的页面,如果找不到(也就是该文件从来没有被读入内存的情况),则会通过mmap()建立的映射关系,从硬盘上将文件读取到物理内存中,如图1中过程3所示。当进程发起读写操作时,会访问虚拟地址空间,通过查询页表,发现这段地址不在物理页上,因为只建立了地址映射,真正的数据还没有拷贝到内存,因此引发缺页异常。

大隐隐于野 1万+

linux内核学习(八)---摄像头框架移植(上)

本章来开始进行摄像头的移植,同时回顾一下V4L2的整个框架

文艺小少年的博客 113

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

mmap 内存映射详解

mmap基础概念 mmap是一种内存映射的方法,这一功能可以用在文件的处理上,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。 在编程时可以使某个磁盘文件的内容看起来像是内存中的一个数组。如果文件由记录组成,而这些记录又能够用结构体来描述的话,可以通过访问结构数组来更新文件的内容。实现这样的映射关系后,进程就可以采用指针的方式读写操...

Tyler_Zx的博客 7354

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

linux mmap内存文件映射

一、传统文件访问 unix访问文件的传统方法使用open打开他们,如果有多个进程访问一个文件,则每一个进程在再记得地址空间都包含有该文件的副本,这不必要地浪费了存储空间。下面说明了两个进程同时读一个文件的同一页的情形,系统要将该页从磁盘读到高速缓冲区中,每个进程再执行一个内存期内的复制操作将数据从高速缓冲区读到自己的地址空间。 二、共享内存映射 现在考虑林一种处理方法:进程A和进程B都将...

whatday的专栏 1万+

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

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【Linux】mmap文件映射

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

2301_80224556的博客 1465

Android-内存映射mmap

一、引言 说到内存映射函数mmap大家可能觉得陌生,其实Android中的Binder机制就是mmap来实现的。不仅如此,微信的MMKV key-value组件、美团的 Logan的日志组件 都是基于mmap来实现的。mmap强大的地方在于通过内存映射直接对文件进行读写,减少了对数据的拷贝次数,大大的提高了IO读写的效率。 二、Linux文件系统 由于Android是基于Linux系统,因此在介绍...

1万+

【Linux】mmap 文件映射

mmap 文件映射

2203_76003626的博客 1087

Android 内存映射mmap浅谈

最能想到mmap函数的是跨进程通信Binder机制中使用到了,它的强大之处在于通过内存映射直接对文件进行读写,减少了对数据的拷贝次数和提高了IO读写的效率。 本篇博文主要讲解的是mmap内存映射相关知识,主要分析了mmap的原理和使用案例流程分析,在Android中Binder机制中其核心就使用了mmap内存映射。

luo_boke的博客 7137
上一篇: ioremap和mmap区别
下一篇: Linux操作系统主要层次
彦祖学嵌入
博客等级 码龄4年 91粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值