首页
学习
活动
专区
工具
TVP
发布

Linux mmap原理

Linux mmap原理 前言 Linux段页式内存管理 mmap mmap内存映射原理 文字概述 mmap函数参数介绍 源码解析 1. 文件映射 2....缺页异常 mmap 和常规文件操作的区别 mmap 使用的细节 小结 ---- 前言 mmaplinux操作系统提供给用户空间调用的内存映射函数,很多人仅仅只是知道可以通过mmap完成进程间的内存共享和减少用户态到内核态的数据拷贝次数...本文想要和大家一起来聊聊mmap的原理,本文整体脉络如下: linux段页式内存管理回顾 mmap原理 ---- Linux段页式内存管理 这里的段页式内存管理主要基于linux 0.11进行讲解...(作者本人并非主攻linux,所以只是对linux 0.11略有研究) 无论是现代操作系统还是最早的linux 0.11操作系统,在对于物理内存的管理,都是将物理内存按页划分,如下图所示:...mmap的实现不是基于linux 0.11的虚拟内存管理方式,而是更复杂的方式,这里大家需要记住上面标红的那段话。

3.3K21
您找到你想要的搜索结果了吗?
是的
没有找到

Linux 内核 内存管理】mmap 系统调用源码分析 ① ( mmapmmap2 系统调用 | Linux 内核中的 mmap 系统调用源码 )

文章目录 一、mmapmmap2 系统调用 二、Linux 内核中的 mmap 系统调用源码 一、mmapmmap2 系统调用 ---- mmap 创建 " 内存映射 " 的 系统调用 有...2 种实现 , mmapmmap2 ; 2 者区别是 : mmap 偏移单位是 " 字节 " , mmap2 偏移单位是 " 页 " , 但是在 arm 64 体系架构中 , 没有实现 mmap2..., 只实现了 mmap 系统调用 ; 二、Linux 内核中的 mmap 系统调用源码 ---- arm64 架构体系中 , 使用 mmap 系统调用 创建 " 内存映射 " , 调用 mmap 系统调用函数...函数 , 继续向下执行 ; mmap 系统调用代码如下 : SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user *, arg) { struct...>> PAGE_SHIFT); } 参考路径 : linux-4.12\mm\mmap.c#1534

10.1K40

Linux内存管理之mmap详解

作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存...系统调用mmap()用于共享内存的两种方式 (1)使用普通文件提供的内存映射:适用于任何进程之间;此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下: fd=open(name,...ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过mmap()实现共享内存的通信方式有许多特点和要注意的地方 (2)使用特殊文件提供匿名内存映射...下面是struct vm_area_struct结构体的定义: #include /* This struct defines a memory VMM memory...结构的成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表

4.3K90

linux内存映射mmap原理分析

mmap()会返回一个指针ptr,它指向进程逻辑地址空间中的一个地址,这样以后,进程无需再调用read或write对文件进行读写,而只需要通过ptr就能够操作文件。...()也是系统调用,如前所述,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间...图2.read系统调用原理 下面这个程序,通过read和mmap两种方法分别对硬盘上一个名为“mmap_test”的文件进行操作,文件中存有10000个整数,程序两次使用不同的方法将它们读出,加1,再写回硬盘...通过对比可以看出,read消耗的时间将近是mmap的两到三倍。...*/ gettimeofday( &tv1, NULL ); fd = open( "mmap_test", O_RDWR ); array = mmap( NULL, sizeof(int)*MAX,

4.3K41

Linux 内核 内存管理】mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )

文章目录 一、do_mmap 函数执行流程 二、do_mmap 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移是内存页大小的整数倍..., 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ; 在 sys_mmap_pgoff 系统调用函数 中 , 最后调用了 vm_mmap_pgoff 函数 , 继续向下执行 ; 在 vm_mmap_pgoff...函数 中 , 核心处理过程就是调用 do_mmap 函数 , 这是 " 内存映射 " 创建的主要函数逻辑 ; 一、do_mmap 函数执行流程 ---- do_mmap 函数 , 主要功能是 创建 "..." 内存映射 " 主要是 do_mmap 函数实现的 , 该函数定义在 Linux 内核源码的 linux-4.12\mm\mmap.c#1320 位置 ; do_mmap 函数源码如下 : /*...(flags & (MAP_POPULATE | MAP_NONBLOCK)) == MAP_POPULATE)) *populate = len; return addr; } 源码路径 : linux

1.8K10

Linux内存管理之mmap详解

作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存...系统调用mmap()用于共享内存的两种方式 (1)使用普通文件提供的内存映射:适用于任何进程之间;此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下: fd=open(name, flag...三. mmap进行内存映射的原理 mmap系统调用的最终目的是将,设备或文件映射到用户进程的虚拟地址空间,实现用户进程对文件的直接读写,这个任务可以分为以下三步: 1.在用户虚拟地址空间中寻找空闲的满足要求的一段连续的虚拟地址空间...,为映射做准备(由内核mmap系统调用完成) 每个进程拥有3G字节的用户虚存空间。...结构的成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表

2.5K40

Linux进程间通信:共享内存 (下)

Linux进程间通信:共享内存 (上) POSIX共享内存 POSIX共享内存实际上毫无新意,它本质上就是mmap对文件的共享方式映射,只不过映射的是tmpfs文件系统上的文件。 什么是tmpfs?...现在绝大多数Linux系统都有一个叫做/dev/shm的tmpfs目录,就是这样一种存在。具体使用方法,大家可以参考我的另一篇文章《Linux内存中的Cache真的能被回收么?》。...Linux提供的POSIX共享内存,实际上就是在/dev/shm下创建一个文件,并将其mmap之后映射其内存地址即可。...()"); exit(1); } /* 使用mmap将对应的tmpfs文件映射到本进程内存 */ shm_p = (int *)mmap(NULL, sizeof...要以共享方式做mmap映射,并且指定文件描述符为shmfd。 shm_unlink实际上就是unlink系统调用的封装。

7.8K12

速通 Linux 共享内存原理

从使用方式上讲,Linux 提供了三种共享内存的方式,包括 Unix 味的 POSIX 和 SysV 接口,还提供了直接文件映射内存的 mmap。...Golang 是通过通讯代替共享内存的优雅代表,下文仅做试验,不建议日常使用 mmap mmap 是 POSIX 规范中的文件映射内存的方法,Linux 并提供了同名系统调用。...mmap 的实现也并不复杂,众所周知 Linux 通过虚拟内存做了内存的虚拟化,进程看到的并不是实际的内存地址,要通过页表等中间层的翻译才能对物理地址进行访问,通过 VMA(vm_area_struct...和 SysV 直接操作内存段不同,POSIX 共享内存基本分为两步,一是通过 shm_open 打开一段内存(返回文件描述符),然后基于该文件描述符,通过 mmap 映射到内存中使用。...总结 从原理上讲 Linux 共享内存的主要方式只有两种,一是基于文件的 mmap,另一种就是 tmpfs,用一张图描述 Linux 几种实现共享内存的方式:

3.9K20

Linux 进程间通信 : 共享内存(上)

前言 本文主要说明在Linux环境上如何使用共享内存。阅读本文可以帮你解决以下问题: 什么是共享内存和为什么要有共享内存? 如何使用mmap进行共享内存? 如何使用XSI共享内存?...所以Linuxmmap实现了一种可以在父子进程之间共享内存地址的方式,其使用方法是: 父进程将flags参数设置MAP_SHARED方式通过mmap申请一段内存。...当然这个结果在不同版本的Linux上可能是不一样的,比如在Centos 6的环境中mmap的共享内存只会记录到buff/cache中。...XSI共享内存在Linux底层的实现实际上跟mmap没有什么本质不同,只是在使用方法上有所区别。...相关的参数包括: SHM_HUGETLB (since Linux 2.6) SHM_HUGE_2MB, SHM_HUGE_1GB (since Linux 3.8) 使用大页内存的好处是提高内核对内存管理的处理效率

10.9K33

Linux 内核 内存管理】mmap 系统调用源码分析 ③ ( vm_mmap_pgoff 函数执行流程 | vm_mmap_pgoff 函数源码 )

文章目录 一、vm_mmap_pgoff 函数执行流程 二、vm_mmap_pgoff 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " ,...如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ; 在 sys_mmap_pgoff 系统调用函数 中 , 最后调用了 vm_mmap_pgoff 函数..., 继续向下执行 ; 一、vm_mmap_pgoff 函数执行流程 ---- 在 vm_mmap_pgoff 函数中 , 首先 , 以 " 写者 " 身份 , 向 Linux 内核申请 读写 " 信号量...函数源码 ---- vm_mmap_pgoff 函数定义在 Linux 内核源码中的 linux-4.12\mm\util.c#296 位置 ; vm_mmap_pgoff 函数源码如下 : unsigned...(mm, &uf); if (populate) mm_populate(ret, populate); } return ret; } 源码路径 : linux-4.12\mm\util.c

1.9K10

POSIX共享内存

Linux中也定义了一些非标准的标志,例如MAP_ANONYMOUS(MAP_ANON),MAP_LOCKED等,具体参考Linux手册。 fd:有效的文件描述符。...mmap内存映射区的大小 Linux下的内存是采用页式管理机制。通过mmap进行内存映射,内核生成的映射区的大小都是以页面大小PAGESIZE为单位,即为PAGESIZE的整数倍。...在Linux 2.4以后,mmap提供匿名内存映射机制,即将mmap的flags参数指定为:MAP_SHARED | MAP_ANON。这样就彻底避免了内存映射文件的创建和打开,简化了对文件的操作。...POSIX共享内存使用方法有以下两个步骤: 通过shm_open创建或打开一个POSIX共享内存对象 然后调用mmap将它映射到当前进程的地址空间 和通过内存映射文件进行通信的使用上差别在于mmap描述符参数获取方式不一样...在Linux 2.6.18中,对于POSIX信号量和共享内存的名字会在/dev/shm下建立对应的路径名,例如上面的测试代码,会生成如下的路径名: # ll /dev/shm/ total 8 -rw-r

2.7K10

Linux 内核 内存管理】mmap 系统调用源码分析 ⑤ ( mmap_region 函数执行流程 | mmap_region 函数源码 )

文章目录 一、mmap_region 函数执行流程 1、检查内存申请是否合法 2、创建 " 虚拟内存区域 " 二、mmap_region 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 "...; 在 do_mmap 函数中 , 调用了 mmap_region 函数 , 创建 " 虚拟内存区域 " ; 一、mmap_region 函数执行流程 ---- 1、检查内存申请是否合法 在 mmap_region...may_expand_vm(mm, vm_flags, (len >> PAGE_SHIFT) - nr_pages)) return -ENOMEM; } 源码路径 : linux-..., prev, rb_link, rb_parent); 源码路径 : linux-4.12\mm\mmap.c#1710 vma_set_page_prot(vma); 源码路径 : linux-4.12...\mm\mmap.c#1743 二、mmap_region 函数源码 ---- mmap_region 函数源码 定义在 Linux 内核源码的 linux-4.12\mm\mmap.c#1602 位置

1.7K20
领券