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

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

系统调用mmap内核实现分析

看下mmap系统调用对应内核源码: // arch/x86/kernel/sys_x86_64.c SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned..., &uf); ... } return ret; } 该方法又调用了do_mmap_pgoff: // include/linux/mm.h...之后,如果我们是想mmap一个file,则调用call_mmap: // include/linux/fs.h static inline int call_mmap(struct file *file...再回到上面的mmap_region方法,如果我们mmap是一块anonymous内存区域,则会调用vma_set_anonymous方法: // include/linux/mm.h static...由上可以看到,mmap系统调用只是为当前进程分配并初始化了一个vma实例,用来标识该进程拥有这段以vma表示内存空间,并没有实际分配物理内存。 对此感兴趣朋友也可以去读读相关内核源码。 完。

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

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

1.9K10

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(

1.9K10

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

内核世界透视 mmap 内存映射本质(源码实现篇)

本文基于内核 5.4 版本源码讨论 本文我们将进入到内核源码实现中,来看一下虚拟内存分配过程,在这个过程中,我们还可以亲眼看到前面介绍 mmap 内存映射原理在内核中具体是如何实现,下面我们就从...4.1 文件映射与匿名映射区布局 文件映射与匿名映射区布局在 linux 内核中分为两种:一种是经典布局,另一种是新式布局,不同体系结构可以通过内核参数 /proc/sys/vm/legacy_va_layout...arch_get_unmapped_area 和 arch_get_unmapped_area_topdown 函数,内核都会提供默认实现,不同体系结构如果没有特殊定制需求,无需单独实现。...从内核世界透视 mmap 内存映射本质.png 在原理篇中笔者首先通过五个角度为大家详细介绍了 mmap 使用方法及其在内核实现原理,这五个角度分别是: 私有匿名映射,其主要用于进程申请虚拟内存...介绍完原理之后,在本文源码实现篇中笔者花了大量篇幅介绍了 mmap内核源码实现,其中最核心两个函数是: get_unmapped_area 函数用于在进程虚拟内存空间中为本次 mmap 映射寻找出一段未被映射空闲虚拟内存地址范围

27040

内核世界透视 mmap 内存映射本质(源码实现篇)

本文基于内核 5.4 版本源码讨论 本文我们将进入到内核源码实现中,来看一下虚拟内存分配过程,在这个过程中,我们还可以亲眼看到前面介绍 mmap 内存映射原理在内核中具体是如何实现,下面我们就从...4.1 文件映射与匿名映射区布局 文件映射与匿名映射区布局在 linux 内核中分为两种:一种是经典布局,另一种是新式布局,不同体系结构可以通过内核参数 /proc/sys/vm/legacy_va_layout...arch_get_unmapped_area 和 arch_get_unmapped_area_topdown 函数,内核都会提供默认实现,不同体系结构如果没有特殊定制需求,无需单独实现。...从内核世界透视 mmap 内存映射本质.png 在原理篇中笔者首先通过五个角度为大家详细介绍了 mmap 使用方法及其在内核实现原理,这五个角度分别是: 私有匿名映射,其主要用于进程申请虚拟内存...介绍完原理之后,在本文源码实现篇中笔者花了大量篇幅介绍了 mmap内核源码实现,其中最核心两个函数是: get_unmapped_area 函数用于在进程虚拟内存空间中为本次 mmap 映射寻找出一段未被映射空闲虚拟内存地址范围

30520

内核世界透视 mmap 内存映射本质(源码实现篇)

本文基于内核 5.4 版本源码讨论 本文我们将进入到内核源码实现中,来看一下虚拟内存分配过程,在这个过程中,我们还可以亲眼看到前面介绍 mmap 内存映射原理在内核中具体是如何实现,下面我们就从...4.1 文件映射与匿名映射区布局 文件映射与匿名映射区布局在 linux 内核中分为两种:一种是经典布局,另一种是新式布局,不同体系结构可以通过内核参数 /proc/sys/vm/legacy_va_layout...arch_get_unmapped_area 和 arch_get_unmapped_area_topdown 函数,内核都会提供默认实现,不同体系结构如果没有特殊定制需求,无需单独实现。...从内核世界透视 mmap 内存映射本质.png 在原理篇中笔者首先通过五个角度为大家详细介绍了 mmap 使用方法及其在内核实现原理,这五个角度分别是: 私有匿名映射,其主要用于进程申请虚拟内存...介绍完原理之后,在本文源码实现篇中笔者花了大量篇幅介绍了 mmap内核源码实现,其中最核心两个函数是: get_unmapped_area 函数用于在进程虚拟内存空间中为本次 mmap 映射寻找出一段未被映射空闲虚拟内存地址范围

34430

Linux mmap原理

缺页异常 mmap 和常规文件操作区别 mmap 使用细节 小结 ---- 前言 mmaplinux操作系统提供给用户空间调用内存映射函数,很多人仅仅只是知道可以通过mmap完成进程间内存共享和减少用户态到内核数据拷贝次数...本文想要和大家一起来聊聊mmap原理,本文整体脉络如下: linux段页式内存管理回顾 mmap原理 ---- Linux段页式内存管理 这里段页式内存管理主要基于linux 0.11进行讲解...mmap实现不是基于linux 0.11虚拟内存管理方式,而是更复杂方式,这里大家需要记住上面标红那段话。...说白了,mmap关键点是实现了用户空间虚拟地址直接映射到页Buffer物理页上,从而实现用户空间无需进入内核即可访问页Buffer。因此mmap效率更高。...,有2次文件拷贝工作 使用内存映射文件读/写流程: 其特点为: 用户空间与内核空间交互式通过映射区域直接交互,用内存读取代替I/O读写,文件读写效率高 可实现高效大规模数据传输 在Linux

3.4K21

内核世界透视 mmap 内存映射本质(源码实现篇)

笔者曾在之前文章 《深入理解 Linux 物理内存分配全链路实现》 中详细地为大家介绍了物理内存分配过程,那么虚拟内存分配过程又是什么样呢?...本文我们将进入到内核源码实现中,来看一下虚拟内存分配过程,在这个过程中,我们还可以亲眼看到前面介绍 mmap 内存映射原理在内核中具体是如何实现,下面我们就从 mmap 系统调用入口处来开始本文内容...4.1 文件映射与匿名映射区布局 文件映射与匿名映射区布局在 linux 内核中分为两种:一种是经典布局,另一种是新式布局,不同体系结构可以通过内核参数 /proc/sys/vm/legacy_va_layout...从内核世界透视 mmap 内存映射本质.png 在原理篇中笔者首先通过五个角度为大家详细介绍了 mmap 使用方法及其在内核实现原理,这五个角度分别是: 私有匿名映射,其主要用于进程申请虚拟内存...介绍完原理之后,在本文源码实现篇中笔者花了大量篇幅介绍了 mmap内核源码实现,其中最核心两个函数是: get_unmapped_area 函数用于在进程虚拟内存空间中为本次 mmap 映射寻找出一段未被映射空闲虚拟内存地址范围

30650

实时Linux内核实现

目前Linux内核主线不支持软实时,而是使用下面2个仓库存放和Linux内核主线版本对应实时内核源代码。...(3)如果使用内核线程执行中断处理函数,那么原来禁止硬中断临界区不需要禁止硬中断,为了兼顾非实时内核和实时内核,引入本地锁,非实时内核把本地锁映射到禁止内核抢占和禁止硬中断,实时内核把本地锁映射到基于实时互斥锁实现自旋锁...(3)在实时内核中大多数禁止内核抢占临界区可以变成可抢占,为了兼顾非实时内核和实时内核,引入本地锁,非实时内核把本地锁映射到禁止内核抢占和禁止硬中断,实时内核把本地锁映射到使用实时互斥锁实现自旋锁...(1)Linux内核使用虚拟内存,对用户空间内存(包括栈、代码段、数据段以及使用函数malloc()或mmap()动态分配内存)使用惰性分配策略,如果实时进程访问虚拟页没有映射到物理页,那么会触发页错误异常...13.对实时应用程序要求 Linux内核对用户空间内存(包括栈、代码段、数据段以及使用函数malloc()或mmap()动态分配内存)使用惰性分配策略,在内存不足时候回收物理页,导致实时进程在访问页时候触发页错误异常

5.9K40

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

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 系统调用函数源码 ---- 该 sys_mmap_pgoff 系统调用函数源码 , 定义在 Linux 内核源码 linux-4.12\...mm\mmap.c#1475 位置 ; sys_mmap_pgoff 函数源码如下 : SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned...(file, addr, len, prot, flags, pgoff); out_fput: if (file) fput(file); return retval; } 源码路径 : linux

1.1K20

Linux mmap完全剖析

在 32位 Linux 内核中,每个进程都独有 4GB 虚拟内存空间,但所有进程却共用相同物理内存空间。...vm_area_struct 结构 在Linux内核中,虚拟内存是用过结构体 vm_area_struct 来管理,通过 vm_area_struct 结构体可以把虚拟内存划分为多个用途不相同内存区...当调用 mmap() 时,内核会创建一个 vm_area_struct 结构,并且把 vm_start 和 vm_end 指向虚拟内存空间某个内存区,并且把 vm_file 字段指向映射文件对象。...一般来说,对映射内存空间进行读写并不会实时写入到文件中,所以要对内存与文件进行同步时需要调用 msync() 函数来实现。...对文件读写 像 read()/write() 这些系统调用,首先需要进行内核空间,然后把文件内容读入到缓存中,然后再对缓存进行读写操作,最后由内核定时同步到文件中。过程如下图: ?

2.5K10

linux内核设计与实现

每个线程拥有独立程序计数器,进程栈和一组进程寄存器 内核调度对象是线程,而不是进程 linux线程实现非常特别,并不特别区分线程和进程 进程提供两种虚拟机制:虚拟处理器和虚拟内存 同一个进程内线程可以共享虚拟内存...线程在linux实现 4.1 liunx线程概述 一组线程共享进程内内存地址空间,打开文件和其他资源 线程机制支持并发程序设计技术,多处理器上保证真正并行处理 linux实现线程机制非常独特...,从内核角度看,没有线程概念 linux把所有线程都当做进程来实现内核没有特别的调度算法或数据结构来表征线程,被视为一个使用某些共享资源进程 每个线程有自己task_struct,就像一个普通进程...调度算法 3.1 概述 linux调度程序定义与kernel/sched.c 2.5版本内核重写调度算法,和以前版本区别很大,实现以下目标 充分实现O(1)调度,不管多少进程或什么输入,每个算法能在恒定时间内完成...内存描述符 内核使用内存描述符表示进程地址空间 内存描述符数据结构位于中mm_struct 内部mmap和mm_rb两个数据结构表示内容一样,此处做了冗余。

2.8K52
领券