mmap是linux中提高文件读写效率的一种手段,这里简单整理一下mmap的原理和使用。 高速页缓存 在介绍文件读写之前需要先了解下页缓存的机制,有助于理解文件读写的底层实现。...在linux文件读写中,内核会将文件内容缓存到物理内存中,以页为单位进行映射。...答案是可以,这就要用到后面要介绍的mmap机制。...--- mmap内存映射 mmap内存映射机制可以将文件的页缓存直接映射到用户空间进行读写,读写过程就和操作用户空间的内存一样,完美的避开了系统调用的上下文切换和数据拷贝。...在mmap中,无论是文件缓存还是内存映射都是以页为单位的。
Linux mmap原理 前言 Linux段页式内存管理 mmap mmap内存映射原理 文字概述 mmap函数参数介绍 源码解析 1. 文件映射 2....缺页异常 mmap 和常规文件操作的区别 mmap 使用的细节 小结 ---- 前言 mmap是linux操作系统提供给用户空间调用的内存映射函数,很多人仅仅只是知道可以通过mmap完成进程间的内存共享和减少用户态到内核态的数据拷贝次数...本文想要和大家一起来聊聊mmap的原理,本文整体脉络如下: linux段页式内存管理回顾 mmap原理 ---- Linux段页式内存管理 这里的段页式内存管理主要基于linux 0.11进行讲解...(作者本人并非主攻linux,所以只是对linux 0.11略有研究) 无论是现代操作系统还是最早的linux 0.11操作系统,在对于物理内存的管理,都是将物理内存按页划分,如下图所示:...mmap的实现不是基于linux 0.11的虚拟内存管理方式,而是更复杂的方式,这里大家需要记住上面标红的那段话。
Linux提供了mmap()函数,用来映射物理内存。...在驱动程序中,应用程序以设备文件为对象,调用mmap()函数,内核进行内存映射的准备工作,生成vm_area_struct结构体,然后调用设备驱动程序中定义的mmap函数。...2.mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。...struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表....所以mmap函数与remap_pfn_range函数是不同的,前者只是生成mmap,而建立页表通过remap_pfn_range函数来完成。
mmap() 系统调用介绍 mmap() 系统调用能够将文件映射到内存空间,然后可以通过读写内存来读写文件。...我们先来看看 mmap() 系统调用的用法吧,mmap() 函数的原型如下: void *mmap(void *start, size_t length, int prot, int flags, int...mmap() 底层原理 在分析 mmap() 系统调用原理之前,首先要知道操作系统的虚拟内存空间与物理内存空间的概念。...在 32位的 Linux 内核中,每个进程都独有 4GB 的虚拟内存空间,但所有进程却共用相同的物理内存空间。...vm_area_struct 结构 在Linux内核中,虚拟内存是用过结构体 vm_area_struct 来管理的,通过 vm_area_struct 结构体可以把虚拟内存划分为多个用途不相同的内存区
文章目录 一、mmap 与 mmap2 系统调用 二、Linux 内核中的 mmap 系统调用源码 一、mmap 与 mmap2 系统调用 ---- mmap 创建 " 内存映射 " 的 系统调用 有...2 种实现 , mmap 和 mmap2 ; 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
~/Downloads/research/linux-5.15.4/include/linux/mm_types.h struct page { unsigned long flags;
memory.h> int main(int argc, char *argv[]) { char *m; size_t s = (8UL * 1024 * 1024); m = 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,
作者: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一次建立所有页表
文章目录 一、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
作者: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一次建立所有页表
1.简介 mmap(memory map)即内存映射,用于将一个文件或设备映射到进程的地址空间。...fd, off_t offset); 成功执行时,mmap()返回被映射区的指针。...失败时,munmap返回-1,errno 返回标志和 mmap 一致。 该调用在进程地址空间中解除一个映射关系,addr是调用mmap()时返回的地址,len是映射区的大小。...而 mmap 操作文件,只需要从磁盘到用户主存的一次数据拷贝,效率更高。 4.作用 mmap 主要有两点作用: 文件映射,减少数据拷贝,提高 IO 效率。 将文件映射到进程的地址空间。...参考文献 认真分析mmap:是什么为什么怎么用- 胡潇
文章目录 一、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
page指针建立映射, 必须使用kmap函数....*页框确实属于高端内存*/ } EXPORT_SYMBOL(kmap); kmap函数只是一个page_address的前端,用于确认指定的页是否确实在高端内存域中....如果确实在高端内存中, 则内核将工作委托给kmap_high kmap_high的实现在函数mm/highmem.c?...cache_is_vivt()) kmap = NULL; else #endif kmap = kmap_high_get(page); if (kmap...) return kmap; type = kmap_atomic_idx_push(); idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR
文章目录 一、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 位置
二级页表地址旺射的最小单位有4K、1K,Linux使用4K。...是否使用cache、是否使用buffer,就有4种组合(Linux内核文件arch\arm\include\asm\pgtable-2level.h): 第1种是不使用cache也不使用buffer,...3.3, 驱动程序要做的事 驱动程序要做的事情有3点: ① 确定物理地址 ② 确定属性:是否使用cache、buffer ③ 建立映射关系 参考Linux源文件,示例代码如下: 还有一个更简单的函数:...9.4 驱动编程 我们在驱动程序中申请一个8K的buffer,让APP通过mmap能直接访问。...我们应该使用kmalloc或kzalloc,这样得到的内存物理地址是连续的,在mmap时后APP才可以使用同一个基地址去访问这块内存。(如果物理地址不连续,就要执行多次mmap了)。
二级页表地址旺射的最小单位有4K、1K,Linux使用4K。 一级页表项里的内容,决定了它是指向一块物理内存,还是指问二级页表,如下图: ?...APP里调用mmap时,导致的内核相关函数调用过程如下: ?...是否使用cache、是否使用buffer,就有4种组合(Linux内核文件arch\arm\include\asm\pgtable-2level.h): ?...3.3, 驱动程序要做的事 驱动程序要做的事情有3点: ① 确定物理地址 ② 确定属性:是否使用cache、buffer ③ 建立映射关系 参考Linux源文件,示例代码如下: ?...我们应该使用kmalloc或kzalloc,这样得到的内存物理地址是连续的,在mmap时后APP才可以使用同一个基地址去访问这块内存。(如果物理地址不连续,就要执行多次mmap了)。
Linux下的进程间通信也可以使用mmap的内存共享映射来实现,mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中,那么进程就可以直接对该内存文件进行操作,mmap也设置了两种机制...通过这样的内存共享映射就相当于是进程直接对磁盘中的文件进行读写操作一样,那么如果有两个进程来mmap同一个文件,就实现了进程间的通信。...磁盘中的文件通过mmap函数来实现映射,然后通过munmap函数取消映射。...先来看一下函数的原型: #include void *mmap(void *addr, size_t length, int prot, int flags, int fd,...如果在运行中出现Bus error (core dumped)错误,需要考虑共享文件是否有存储空间(也就是说你要mmap一个4096的文件,但实际文件没有4096那么大)。
如果映射被重新定位,则指向旧映射位置的绝对指针将变得无效 MREMAP_FIXED (since Linux 2.3.31) 该标志的用途与 mmap(2) 的 MAP_FIXED 标志类似。...5.使用场景 Linux mmap 是一个灵活的系统调用,主要用于在进程的虚拟地址空间中创建映射,使得文件、设备、匿名映射等对象能够直接映射到进程的地址空间。...6.FAQ (1)mmap 映射到进程的虚拟地址是一样的吗? 在 Linux 中,mmap 函数可以用于将一个文件或者其他对象映射到进程的地址空间。...参考文献 mmap(2) - Linux manual page mmap - opengroup.org 认真分析mmap:是什么为什么怎么用- 胡潇 Linux source code (v6.0...Linux的虚拟内存详解(MMU、页表结构) When would you use mmap - Stack Overflow
—-mmap是什么 mmap是一种虚拟内存映射文件的方法,它可以将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对应关系。...mmap 模块提供“内存映射的文件对象”,mmap 对象可以用在使用 plain string 的地方,mmap 对象和 plain string 的区别是: mmap 对象不提供字符串对象的方法; mmap...对象是可变的,而 str 对象是不可变的 mmap 对象同时对应于打开的文件,多态于一个Python file 对象 mmap 对象可以切片和索引,也可以为它的切片或索引赋值(因为 mmap 对象是可变的...—-创建 mmap 对象 mmap(filedesc, length, tagname=”) #windows mmap(filedesc, length, flag=MAP_SHARED, prot=...; 参数 prot 对应的取值包括:mmap.PROT_READ, mmap.PROT_WRITE 和 mmap.PROT_WRITE | mmap.PROT_READ。
领取专属 10元无门槛券
手把手带您无忧上云