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

Linux mmap原理

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

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

    Linux内存映射——mmap

    Linux提供了mmap()函数,用来映射物理内存。...ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过mmap()实现共享内存通信方式有许多特点和要注意地方...一般来说,子进程单独维护从父进程继承下来一些变量。而mmap()返回地址,却由父子进程共同维护。 对于具有亲缘关系进程实现共享内存最好方式应该是采用匿名内存映射方式。...三 mmap进行内存映射原理 mmap系统调用最终目的是将,设备或文件映射到用户进程虚拟地址空间,实现用户进程对文件直接读写,这个任务可以分为以下三步: 1.在用户虚拟地址空间中寻找空闲满足要求一段连续虚拟地址空间...(设备驱动完成) 建立文件映射第二步就是建立虚拟地址和具体物理地址之间映射,这是通过修改进程页表来实现.mmap方法是file_opeartions结构成员: int (*mmap)(

    5.7K10

    Linux 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 结构体可以把虚拟内存划分为多个用途不相同内存区...一般来说,对映射内存空间进行读写并不会实时写入到文件中,所以要对内存与文件进行同步时需要调用 msync() 函数来实现

    2.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 系统调用函数..., 执行如下操作 : 先检查 " 偏移 " 是否是 " 内存页大小 " " 整数倍 " , 如果偏移不是内存页大小整数倍 , 返回 -EINVAL 错误 ; 如果偏移是内存页大小整数倍 , 则调用...a.fd, a.offset >> PAGE_SHIFT); } 参考路径 : linux-4.12\mm\mmap.c#1534

    10.6K40

    Linux申请大页内存(mmap)

    如果进程使用内存过大,比如1GB,这样会在页表中占用 1GB / 4KB = 262144个页表项,而系统TLB可以容纳页表项远小于这个数量。...当多个内存密集型应用访问内存时,会造成过多TLB未命中,因此在特定情况下会需要减少未命中次数,一个可行办法就是增大每个页尺寸。...memory.h> int main(int argc, char *argv[]) { char *m; size_t s = (8UL * 1024 * 1024); m = mmap...\n"); getchar(); munmap(m, s); return 0; } ---- 3.最后的话 大页内存好处不仅是减少TLB未命中次数,而且大页内存分配是物理内存,不会被操作系统内存管理换出到磁盘上...,因此不会出现缺页中断,也就不会引入访问磁盘时延,另外,大页内存在物理上是连续,对于大内存访问也有一定加速效果。

    11.8K110

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

    文章目录 一、do_mmap 函数执行流程 二、do_mmap 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " " 整数倍 " , 如果偏移是内存页大小整数倍...函数 中 , 核心处理过程就是调用 do_mmap 函数 , 这是 " 内存映射 " 创建主要函数逻辑 ; 一、do_mmap 函数执行流程 ---- do_mmap 函数 , 主要功能是 创建 "...内存映射 " ; 首先 , 执行 get_unmapped_area 函数 , 获取未被映射内存区域 , 根据不同情况 , 如 " 文件映射 " 还是 " 匿名映射 " , 调用对应 " 分配虚拟地址区间..." 内存映射 " 主要是 do_mmap 函数实现 , 该函数定义在 Linux 内核源码 linux-4.12\mm\mmap.c#1320 位置 ; do_mmap 函数源码如下 : /*...(flags & (MAP_POPULATE | MAP_NONBLOCK)) == MAP_POPULATE)) *populate = len; return addr; } 源码路径 : linux

    2K10

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

    Linux进程间通信也可以使用mmap内存共享映射来实现mmap作用就是把磁盘文件一部分直接映射到进程内存中,那么进程就可以直接对该内存文件进行操作,mmap也设置了两种机制...通过这样内存共享映射就相当于是进程直接对磁盘中文件进行读写操作一样,那么如果有两个进程来mmap同一个文件,就实现了进程间通信。...磁盘中文件通过mmap函数来实现映射,然后通过munmap函数取消映射。...下面简单实现通过mmap实现进程间通信,先看以下写操作代码: #include #include #include #include...由于这只是实现两个进程间通信,那么对于test文件来说在没有进程运行时候没有什么作用,所以它可以设置为一个临时文件,所以可以在代码中使用unlink函数,在进程结束以后删除test文件。

    8.2K30

    Linux内存管理之mmap详解

    作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存...ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过mmap()实现共享内存通信方式有许多特点和要注意地方 (2)使用特殊文件提供匿名内存映射...一般来说,子进程单独维护从父进程继承下来一些变量。而mmap()返回地址,却由父子进程共同维护。 对于具有亲缘关系进程实现共享内存最好方式应该是采用匿名内存映射方式。...三. mmap进行内存映射原理 mmap系统调用最终目的是将,设备或文件映射到用户进程虚拟地址空间,实现用户进程对文件直接读写,这个任务可以分为以下三步: 1.在用户虚拟地址空间中寻找空闲满足要求一段连续虚拟地址空间...结构成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表

    4.5K90

    linux内存映射mmap原理分析

    ()实现,所以建立内存映射效率很高。...效率 从代码层面上看,从硬盘上将文件读入内存,都要经过文件系统进行数据拷贝,并且数据拷贝操作是由文件系统和硬件驱动实现,理论上来说,拷贝数据效率是一样。...;而mmap()也是系统调用,如前所述,mmap()中没有进行数据拷贝,真正数据拷贝是在缺页中断处理时进行,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间...图2.read系统调用原理 下面这个程序,通过read和mmap两种方法分别对硬盘上一个名为“mmap_test”文件进行操作,文件中存有10000个整数,程序两次使用不同方法将它们读出,加1,再写回硬盘...通过对比可以看出,read消耗时间将近是mmap两到三倍。

    4.4K41

    Linux内存管理之mmap详解

    作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存..., mode); if(fd<0) ... ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过mmap()实现共享内存通信方式有许多特点和要注意地方...一般来说,子进程单独维护从父进程继承下来一些变量。而mmap()返回地址,却由父子进程共同维护。 对于具有亲缘关系进程实现共享内存最好方式应该是采用匿名内存映射方式。...三. mmap进行内存映射原理 mmap系统调用最终目的是将,设备或文件映射到用户进程虚拟地址空间,实现用户进程对文件直接读写,这个任务可以分为以下三步: 1.在用户虚拟地址空间中寻找空闲满足要求一段连续虚拟地址空间...结构成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表

    2.6K40

    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 函数源码 ---- vm_mmap_pgoff...函数定义在 Linux 内核源码中 linux-4.12\mm\util.c#296 位置 ; vm_mmap_pgoff 函数源码如下 : unsigned long vm_mmap_pgoff(

    2.1K10

    Linux进程内存管理之malloc和mmap

    通过《Linxu进程内存管理》,我们知道了进程内存最小单位是vma,根据不同用处又划分了不同类型vma,比如 heap: 动态分配和释放内存 stack: 存放局部变量和实现函数调用 mmap...:文件区间映射到虚拟地址空间内存映射 text,data,bss 这篇我们就看下进程动态申请内存,我们知道进程动态申请内存函数是malloc,这篇讲下其涉及到vma,即heap和mmap。...malloc 在linux标准libc库种,malloc函数实现会根据分配内存size来决定使用哪个分配函数,当size小于等于128KB时,调用brk分配;当size大于128KB时,调用mmap...size可由M_MMAP_THRESHOLD选项调节。如下图: ?...sys_brk分配过过程主要是调整brk位置 sys_mmap分配过程中主要是在堆和栈中间(memory mapping segment)找一段空闲虚拟内存 ?

    5K11

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

    是否是 " 内存页大小 " " 整数倍 " , 如果偏移是内存页大小整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ; 在 sys_mmap_pgoff 系统调用函数 中..., 最后调用了 vm_mmap_pgoff 函数 , 继续向下执行 ; 在 vm_mmap_pgoff 函数 中 , 核心处理过程就是调用 do_mmap 函数 , 这是 " 内存映射 " 创建主要函数逻辑...4.12\mm\mmap.c#1612 然后 , 检查 申请 内存空间 , 是否与旧 虚拟内存空间 有 重叠 , 如果有重叠部分 , 则调用 do_munmap 函数 , 删除内存空间 ; /*..., 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.9K20

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

    改进方法就是让程序可以直接读写驱动程序中buffer,这可以通过mmap实现(memory map),把内核buffer映射到用户态,让APP在用户态直接读写。...二级页表地址旺射最小单位有4K、1K,Linux使用4K。...3.3, 驱动程序要做事 驱动程序要做事情有3点: ① 确定物理地址 ② 确定属性:是否使用cache、buffer ③ 建立映射关系 参考Linux源文件,示例代码如下: 还有一个更简单函数:...9.4 驱动编程 我们在驱动程序中申请一个8Kbuffer,让APP通过mmap能直接访问。...我们应该使用kmalloc或kzalloc,这样得到内存物理地址是连续,在mmap时后APP才可以使用同一个基地址去访问这块内存。(如果物理地址不连续,就要执行多次mmap了)。

    4K31

    一文读懂 Linux mmap 内存映射

    2.实现原理 mmap 实现内存映射,总的来说分为三个阶段: (1)进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域。 进程在用户空间调用函数 mmap(2)。...MAP_STACK (since Linux 2.6.27) 将映射分配到适合进程或线程栈空间。该标志目前是无操作,但在 glibc 线程实现中有使用。...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

    4K01
    领券