首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux mmap原理

Linux mmap原理 前言 Linux段页式内存管理 mmap mmap内存映射原理 文字概述 mmap函数参数介绍 源码解析 1. 文件映射 2....,但是并没有深入理解mmap操作系统内部是如何实现的,原理是什么。...本文想要和大家一起来聊聊mmap的原理,本文整体脉络如下: linux段页式内存管理回顾 mmap原理 ---- Linux段页式内存管理 这里的段页式内存管理主要基于linux 0.11进行讲解...,因此linux 0.11中多个进程可以共享一套页表。...,有2次文件拷贝工作 使用内存映射文件读/写的流程: 其特点为: 用户空间与内核空间的交互式通过映射的区域直接交互,用内存的读取代替I/O读写,文件读写效率高 可实现高效的大规模数据传输 Linux

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

Linux内存映射——mmap

Linux提供了mmap()函数,用来映射物理内存。...驱动程序中,应用程序以设备文件为对象,调用mmap()函数,内核进行内存映射的准备工作,生成vm_area_struct结构体,然后调用设备驱动程序中定义的mmap函数。...共享内存中的内容往往是解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。 基于文件的映射,mmap和munmap执行过程的任何时刻,被映射文件的st_atime可能被更新。...(2)使用特殊文件提供匿名内存映射:适用于具有亲缘关系的进程之间;由于父子进程特殊的亲缘关系,父进程中先调用mmap(),然后调用fork()。...struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表.

5.6K10

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.6K40

linux内存映射mmap原理分析

前面讲过,建立内存映射并没有实际拷贝数据,这时,MMU地址映射表中是无法找到与ptr相对应的物理地址的,也就是MMU失败,将产生一个缺页中断,缺页中断的中断响应函数会在swap中寻找相对应的页面,如果找不到...()也是系统调用,如前所述,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.4K41

Linux内存管理之mmap详解

作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存...基于文件的映射,mmap和munmap执行过程的任何时刻,被映射文件的st_atime可能被更新。如果st_atime字段在前述的情况下没有得到更新,首次对映射区的第一个页索引时会更新该字段的值。...:适用于具有亲缘关系的进程之间;由于父子进程特殊的亲缘关系,父进程中先调用mmap(),然后调用fork()。...那么调用fork()之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap()返回的地址,这样,父子进程就可以通过映射区域进行通信了。注意,这里不是一般的继承关系。...结构的成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表

4.4K90

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 函数实现的 , 该函数定义 Linux 内核源码的 linux-4.12\mm\mmap.c#1320 位置 ; do_mmap 函数源码如下 : /*...(flags & (MAP_POPULATE | MAP_NONBLOCK)) == MAP_POPULATE)) *populate = len; return addr; } 源码路径...: linux-4.12\mm\mmap.c#1320

1.9K10

Linux内存管理之mmap详解

作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存...共享内存中的内容往往是解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。 基于文件的映射,mmap和munmap执行过程的任何时刻,被映射文件的st_atime可能被更新。...(2)使用特殊文件提供匿名内存映射:适用于具有亲缘关系的进程之间;由于父子进程特殊的亲缘关系,父进程中先调用mmap(),然后调用fork()。...那么调用fork()之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap()返回的地址,这样,父子进程就可以通过映射区域进行通信了。注意,这里不是一般的继承关系。...结构的成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表

2.6K40

Linux mmap 的作用是什么?

当前这个标志只x86-64平台上得到支持。 MAP_POPULATE //为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞。...失败时,munmap返回-1,errno 返回标志和 mmap 一致。 该调用在进程地址空间中解除一个映射关系,addr是调用mmap()时返回的地址,len是映射区的大小。...同步函数: int msync(void *addr, size_t len, int flags) 一般说来,进程映射空间的对共享内容的改变并不直接写回到磁盘文件中,往往调用 munmap() 后才执行该操作...3.inodeaddress_space上查找要请求的文件页是否已经缓存在页缓存中。如果存在,则直接返回这片文件页的内容。...参考文献 认真分析mmap:是什么为什么怎么用- 胡潇

30630

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

如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ; sys_mmap_pgoff 系统调用函数 中 , 最后调用了 vm_mmap_pgoff 函数..., 继续向下执行 ; 一、vm_mmap_pgoff 函数执行流程 ---- vm_mmap_pgoff 函数中 , 首先 , 以 " 写者 " 身份 , 向 Linux 内核申请 读写 " 信号量...物理地址空间 分配 内存页 , 并将 虚拟地址空间 的 内存页 映射到 物理内存页 中 ; 二、vm_mmap_pgoff 函数源码 ---- vm_mmap_pgoff 函数定义 Linux 内核源码中的...linux-4.12\mm\util.c#296 位置 ; vm_mmap_pgoff 函数源码如下 : unsigned long vm_mmap_pgoff(struct file *file,...(mm, &uf); if (populate) mm_populate(ret, populate); } return ret; } 源码路径 : linux-4.12\mm\util.c

2K10

韦东山:Linux驱动程序基石之mmap

MMU负责把虚拟地址映射为物理地址,虚拟地址映射到哪个物理地址去?映射关系保存在页表中: ?...二级页表地址旺射的最小单位有4K、1K,Linux使用4K。 一级页表项里的内容,决定了它是指向一块物理内存,还是指问二级页表,如下图: ?...是否使用cache、是否使用buffer,就有4种组合(Linux内核文件arch\arm\include\asm\pgtable-2level.h): ?...4,驱动编程 我们驱动程序中申请一个8K的buffer,让APP通过mmap能直接访问。 ① 使用哪一个函数分配内存?...我们应该使用kmalloc或kzalloc,这样得到的内存物理地址是连续的,mmap时后APP才可以使用同一个基地址去访问这块内存。(如果物理地址不连续,就要执行多次mmap了)。

6.9K40

Linux的内存共享映射(mmap和munmap)

Linux下的进程间通信也可以使用mmap的内存共享映射来实现,mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中,那么进程就可以直接对该内存文件进行操作,mmap也设置了两种机制...磁盘中的文件通过mmap函数来实现映射,然后通过munmap函数取消映射。...最后一个参数偏移量表示要从文件的哪个地方开始映射,应为4096的整数倍。        ...由于这只是实现两个进程间的通信,那么对于test文件来说没有进程运行的时候没有什么作用,所以它可以设置为一个临时文件,所以可以代码中使用unlink函数,进程结束以后删除test文件。...还有进行通信时可以将数据封装为一个结构体,通过结构体进行数据的传递。

8K30

一文读懂 Linux mmap 内存映射

5.使用场景 Linux mmap 是一个灵活的系统调用,主要用于进程的虚拟地址空间中创建映射,使得文件、设备、匿名映射等对象能够直接映射到进程的地址空间。...父进程中先调用 mmap(),然后调用 fork()。那么调用 fork() 之后,子进程继承父进程匿名映射的地址区域,同样也继承 mmap() 返回的地址。...其实我们只需要在可执行程序A、B、C中保存一小点信息,这点信息里记录了依赖了哪个库,那么当可执行程序运行起来后再把相应的库加载到内存。...6.FAQ (1)mmap 映射到进程的虚拟地址是一样的吗? Linux 中,mmap 函数可以用于将一个文件或者其他对象映射到进程的地址空间。...参考文献 mmap(2) - Linux manual page mmap - opengroup.org 认真分析mmap:是什么为什么怎么用- 胡潇 Linux source code (v6.0

1.1K00

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

文章目录 一、sys_mmap_pgoff 系统调用函数执行流程 二、sys_mmap_pgoff 系统调用函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的..." 整数倍 " , 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ; 一、sys_mmap_pgoff 系统调用函数执行流程 ---- sys_mmap_pgoff...函数中 , 首先 , 进行 " 文件映射 " , 进程 中 维护了一个 打开文件 列表 , 根据 " 文件描述符 " 在上述列表 中查找 文件实例 ; 然后 , 执行 " 匿名巨型页映射 " , ...系统调用函数源码 ---- 该 sys_mmap_pgoff 系统调用函数源码 , 定义 Linux 内核源码的 linux-4.12\mm\mmap.c#1475 位置 ; sys_mmap_pgoff...(file, addr, len, prot, flags, pgoff); out_fput: if (file) fput(file); return retval; } 源码路径 : linux

1.1K20
领券