Linux mmap讲解

article/2025/10/23 20:26:35

0 引言

Linux 提供了非常强大的 mmap(2) 系统调用; 它使开发人员能够将任何内容直接映射到进程虚拟地址空间 (VAS)。 此内容包括文件数据、硬件设备(适配器)内存区域,或只是通用内存区域。 在本文中,我们将只关注使用 mmap(2) 将常规文件的内容映射到进程 VAS 中。

1 mmap简介

mmap(2)系统调用接口如下

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

如果将文件的给定区域,从给定的偏移量offset和长度length字节映射到我们的进程虚拟地址空间 VAS; 下图描绘了想要实现的目标的简单视图:

为了实现这个文件映射到进程的VAS,可使用 mmap(2) 系统调用。

关于mmap的相关参数解释如下

fd    由open系统调用等打开的文件描述符

offset  文件映射的偏移位置

length  文件映射的长度

addr    向内核提示应该在进程 VAS 中的哪个位置创建映射; 建议在这里传递 0 (NULL),允许操作系统决定新映射的位置

prot  给定区域的内存保护标志位

flag  是一个称为标志的位掩码; 有几个标志,它们影响映射的许多属性。

上述prot具体由如下四个标志构成

PROT_NONE
没有访问权限
PROT_READ
拥有读权限
PROT_WRITE
拥有写权限
PROT_EXEC
拥有可执行权限

2 文件和匿名映射

mmap映射可分为:文件映射和匿名区映射。

mmap中的flag标记由如下概念

MAP_SHARED: 映射是共享的; 其他进程可能同时在同一个映射上工作(事实上,这是实现 IPC 机制(共享内存)的通用方式)。 在文件映射的情况下,如果写入内存区域,则更新底层文件! (您可以使用 msync(2) 来控制将内存写入刷新到底层文件。)

MAP_PRIVATE: 这建立了一个私有映射; 如果它是可写的,它意味着 COW 语义)。 私有的文件映射区域不会对底层文件进行写入。 实际上,私有文件映射在 Linux 上很常见:这正是在开始执行进程时,加载器将二进制可执行文件的文本和数据以及 进程使用的所有共享库的文本和数据。

3 mmap的优点

mmap(2) 通过在内部将包含文件数据(从存储设备读入)的内核页面缓存页面直接映射到进程虚拟地址空间来设置文件映射。这是零拷贝技术的一种实现。

下图更加形象的说明mmap的工作过程

 一个map并不是一个copy。

4 代码示例

该部分代码可参考

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>#define handle_error(msg) \do { perror(msg); exit(EXIT_FAILURE); } while (0)int main(int argc, char *argv[]) {char *addr = nullptr;int fd{-1};fd = open(argv[1], O_RDONLY);if (fd == -1)handle_error("open");addr = static_cast<char*>(mmap(NULL, 10 * sysconf(_SC_PAGE_SIZE), PROT_READ,MAP_SHARED, fd, 0));if (addr == MAP_FAILED)handle_error("mmap");while (true) {sleep(10);}        exit(EXIT_SUCCESS);
}

譬如我运行两次

./main test1.cc
./main test1.cc

在我的机器上通过fincore test1.cc显示如下结果

RES PAGES  SIZE FILE4K     1  818B test1.cc

5 总结

本文总结了mmap的基本概念和使用。


http://chatgpt.dhexx.cn/article/ObW9KIwc.shtml

相关文章

mmap内存映射

内存映射通信 一、mmap (memory_map) 1.1 简介 存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中取数据&#xff0c;就相当于读文件中的相应字节。于此类似&#xff0c;将数据存入缓冲区&#xff0c;则相应的字节就自动写入…

Linux编程之mmap示例

一、问题背景 Linux下&#xff0c;针对文件读写操作&#xff0c;一般有三个步骤&#xff1a; 1&#xff09;把文件内容读入到内存中&#xff1b;调用read&#xff08;系统调用&#xff09;&#xff0c;从内核态读取文件内容到虚拟内存&#xff1b; 2&#xff09;修改内存中的内…

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

目录 有什么用&#xff1f; 1、文件映射 2、分配内存&#xff08;匿名文件映射&#xff09; mmap基础概念 mmap内存映射原理 mmap和常规文件操作的区别 mmap优点总结 mmap相关函数 mmap使用细节 性能总结 效率对比 有什么用&#xff1f; 将一个文件或者其它对象映射…

mmap使用

linux进程虚拟地址空间中存在一段称为mmap的内存区&#xff0c;当申请用户内存较大时&#xff0c;如大于128kb&#xff0c;系统一般会通过mmap系统调用直接映射一片内存区&#xff0c;使用结束后再通过ummap系统调用归还。关于mmap的原理网上有很多文档&#xff0c;这里不再赘述…

MMAP技术

1. mmap 基础概念 mmap 即 memory map&#xff0c;也就是内存映射。 mmap 是一种内存映射文件的方法&#xff0c;即将一个文件或者其它对象映射到进程的地址空间&#xff0c;实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后&#xff…

mmap在嵌入式中的应用

大概雍正皇帝怎么也不会想到&#xff0c;自己在西历2022年的男生和女生眼里&#xff0c;会是截然不同的两种形象。 1 以我对身边同学朋友的观察&#xff0c;男生们大多爱看《雍正王朝》&#xff0c;他们眼中的雍正&#xff0c;大约是个推行了“火耗归公”、“摊丁入亩”等遏制…

Linux mmap原理

Linux mmap原理 前言Linux段页式内存管理mmapmmap内存映射原理文字概述mmap函数参数介绍源码解析1. 文件映射2. 缺页异常 mmap 和常规文件操作的区别mmap 使用的细节 小结 前言 mmap是linux操作系统提供给用户空间调用的内存映射函数&#xff0c;很多人仅仅只是知道可以通过mm…

Linux内存管理之mmap

目录 一. mmap系统调用 1. mmap系统调用 2. 系统调用munmap() 3. 系统调用msync() 二. 系统调用mmap()用于共享内存的两种方式&#xff1a; 三. mmap进行内存映射的原理 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多…

Linux内核黑科技——mmap实现详解

前言&#xff1a;故事的开始是这样的&#xff0c;某天在脉脉上看到有人发了下面的帖子&#xff1a; 想不到 mmap 都成了黑科技了&#xff0c;为了让大家都能了解这个黑科技&#xff0c;所以还是写篇文章来详细介绍一下 mmap 的实现吧。 其实&#xff0c;源码分析是比较难写的&…

【Linux】Linux编程之 mmap解析

前言 虚拟内存系统通过将虚拟内存分割为称作虚拟页(Virtual Page&#xff0c;VP)大小固定的块&#xff0c;一般情况下&#xff0c;每个虚拟页的大小默认是4096字节。同样的&#xff0c;物理内存也被分割为物理页(Physical Page&#xff0c;PP)&#xff0c;也为4096字节。 一、…

讲一讲什么是 MMAP

1. mmap 基础概念 mmap 即 memory map&#xff0c;也就是内存映射。 mmap 是一种内存映射文件的方法&#xff0c;即将一个文件或者其它对象映射到进程的地址空间&#xff0c;实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后&#xff…

人工神经网络的应用有哪些方面,人工神经网络在生活中的应用

人工神经网络的应用 人工神经网络&#xff08;Artificial Neural Network&#xff0c;简称ANN &#xff09;&#xff0c;以数学模型模拟神经元活动&#xff0c;是基于模仿大脑神经网络结构和功能而建立的一种信息处理系统。人工神经网络具有自学习、自组织、自适应以及很强的非…

人工神经网络有哪些算法,神经网络都有哪些算法

人工神经网络分类方法 从20世纪80年代末期&#xff0c;人工神经网络方法开始应用于遥感图像的自动分类。 目前&#xff0c;在遥感图像的自动分类方面&#xff0c;应用和研究比较多的人工神经网络方法主要有以下几种&#xff1a;&#xff08;1&#xff09;BP&#xff08;BackP…

深度学习-人工神经网络概述

人工神经网络 简述 很多术语听起来很唬人&#xff0c;“人工神经网络”就属于其中之一。在很多人看来&#xff0c;我们对人类的神经系统还没有研究透彻&#xff0c;这就来了一个“人工的”神经网络&#xff0c;人脑这样复杂&#xff0c;那么人工神经网络一定相当高深莫测。如果…

人工神经网络的应用实例,人工神经网络实际应用

神经网络算法实例说明有哪些&#xff1f; 在网络模型与算法研究的基础上&#xff0c;利用人工神经网络组成实际的应用系统&#xff0c;例如&#xff0c;完成某种信号处理或模式识别的功能、构作专家系统、制成机器人、复杂系统控制等等。 纵观当代新兴科学技术的发展历史&…

人工神经网络算法实战教程

神经网络&#xff08;Artificial Neural Network&#xff0c;也称为人工神经网络&#xff0c;简称ANN&#xff09;具有通过示例学习能力。ANN是受生物神经元系统启发的的信息处理模型&#xff0c;它由大量高度互联的处理元素组成&#xff0c;这些处理元素被称神经元&#xff0c…

人工神经网络的三个要素,神经网络三要素是指

一个完整的人工神经网络包括 人工神经网络主要架构是由神经元、层和网络三个部分组成。整个人工神经网络包含一系列基本的神经元、通过权重相互连接。神经元是人工神经网络最基本的单元。 单元以层的方式组&#xff0c;每一层的每个神经元和前一层、后-层的神经元连接&#x…

人工神经网络连接方式,全连接神经网络作用

人工神经元网络的拓扑结构主要有哪几种&#xff1f;谢谢大侠~~~ 神经网络的拓扑结构包括网络层数、各层神经元数量以及各神经元之间相互连接的方式。人工神经网络的模型从其拓扑结构角度去看&#xff0c;可分为层次型和互连型。 层次型模型是将神经网络分为输入层&#xff08…

神经网络算法的具体流程,人工神经网络算法步骤

神经网络 算法 思路&#xff1f;能否提供一个最简单的代码&#xff1f; 30 。 最基本的BP算法&#xff1a;1&#xff09;正向传播&#xff1a;输入样本&#xff0d;>输入层&#xff0d;>各隐层&#xff08;处理&#xff09;&#xff0d;>输出层注1&#xff1a;若输出…

人工神经网络的基本原理

1.1 人工神经网络原理 MeCulloch 和 Pitts 基于对大脑神经元的研究提 出了人工神经元模型&#xff08;M-P 模型&#xff09;。人工神经元模型如下图所示。 M-P模型把神经元看作n个的输入对应产生1个输出&#xff0c;该模型的函数的表达式如下&#xff1a; 该表达式中W[W1,W2,W3…