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

【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

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

    Linux mmap原理

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

    3.8K21

    【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.9K20

    【Linux内核】零拷贝技术

    Linux中IO读写方式 Linux中提供了轮询、IO中断以及DMA传输这三种磁盘与主存之间的数据传输机制。其中: 轮询方式是基于死循环IO端口进行不断检测。...mmap是Linux提供的一种内存映射文件方法,即 将一个进程地址空间中的一段虚拟地址映射到磁盘文件地址,mmap + write 伪代码如下: tmp_buf = mmap(file_fd, len)...基于mmap + write 系统调用的零拷贝方式,整个拷贝过程会发生4次上下文切换,1次CPU拷贝和2次DMA拷贝,用户读写数据流程如下: 1、用户进程通过 mmap() 函数向内核发起系统调用,从用户态切换为内核态...sendfile + DMA gather copy Linux2.4版本的内核对sendfile系统调用进行修改,为DMA拷贝引入了 gather 操作。...Linux零拷贝对比 无论是传统IO拷贝方式还是引入零拷贝方式,2次DMA copy是少不了的,因为两次DMA都是依赖硬件完成的。

    23010

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

    【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

    2.1K10

    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.5K41

    【Flink】第十八篇:Direct Memory 一箩筐

    linux的mmap模式 linux mmap函数的作用相当于是内存共享,将内核空间的内存区域和用户空间共享,这样就避免了将内核空间的数据拷贝到用户空间的步骤,通过mmap函数发送数据时上述的步骤如下:...操作系统通过DMA传输将内核socket缓冲区数据拷贝给网卡发送数据 mmap内存映射将会经历:3次拷贝: 1次cpu copy,2次DMA copy;以及4次上下文切换。...在Java NIO中的FileChannel.map()方法其实就是采用了操作系统中的内存映射方式,底层就是调用Linux mmap()实现的。...FileChannel.map()是抽象方法,具体实现是在 FileChannelImpl.c 可自行查看JDK源码,其map0()方法就是调用了Linux内核的mmap的API。...sendfile模式改进 Linux2.4 内核对sendFile模式进行了改进。需要DMA控制器支持。

    1.7K20

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

    二级页表地址旺射的最小单位有4K、1K,Linux使用4K。...这在很多时间要小心处理:比如CPU产生了新数据,DMA把数据从内存搬到网卡,这时候就要CPU执行命令先把新数据从cache刷到内存。...反过来也是一样的,DMA从网卡得过了新数据存在内存里,CPU读数据之前先把cache中的数据丢弃。...是否使用cache、是否使用buffer,就有4种组合(Linux内核文件arch\arm\include\asm\pgtable-2level.h): 第1种是不使用cache也不使用buffer,...3.3, 驱动程序要做的事 驱动程序要做的事情有3点: ① 确定物理地址 ② 确定属性:是否使用cache、buffer ③ 建立映射关系 参考Linux源文件,示例代码如下: 还有一个更简单的函数:

    4.2K31

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

    文章目录 一、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

    10.7K40

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

    二级页表地址旺射的最小单位有4K、1K,Linux使用4K。 一级页表项里的内容,决定了它是指向一块物理内存,还是指问二级页表,如下图: ?...这在很多时间要小心处理:比如CPU产生了新数据,DMA把数据从内存搬到网卡,这时候就要CPU执行命令先把新数据从cache刷到内存。...反过来也是一样的,DMA从网卡得过了新数据存在内存里,CPU读数据之前先把cache中的数据丢弃。...是否使用cache、是否使用buffer,就有4种组合(Linux内核文件arch\arm\include\asm\pgtable-2level.h): ?...3.3, 驱动程序要做的事 驱动程序要做的事情有3点: ① 确定物理地址 ② 确定属性:是否使用cache、buffer ③ 建立映射关系 参考Linux源文件,示例代码如下: ?

    7.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 linux/mm_types.h> /* This struct defines a memory VMM memory...结构的成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表

    4.5K90
    领券
    首页
    学习
    活动
    专区
    圈层
    工具
    MCP广场