首页
学习
活动
专区
工具
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 系统调用函数...sys_mmap_pgoff 函数 , 继续向下执行 ; mmap 系统调用代码如下 : SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user...a.fd, a.offset >> PAGE_SHIFT); } 参考路径 : linux-4.12\mm\mmap.c#1534

10.6K40

mmap系统调用

一、内存使用方法 二、mmap系统调用 一、内存使用方法 1.创建内存映射 #include void *mmap(void *addr,size_t length,int...二、mmap系统调用 0.查找mmap在内核中的系统调用函数 我现在用的内核版是4.19.40,首先在应用层参考上面解析编写一个mmap使用代码,然后编译成程序,在使用strace工具跟踪其函数调用,...可以发现mmap也是调用底层的mmap系统调用,然后我们寻找一下底层的带6个参数的mmap系统调用有哪些: 可以看到,arm64和X86的系统调用位于不同文件。...1.mmap系统调用 x86的位于arch/x86/kernel/sys_x86_64.c文件,如下所示: SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned...下面是mmap系统调用的函数调用以及返回情况说明: SYSCALL_DEFINE6(mmap, offset_in_page(off) //检查偏移是不是页的整数倍, ksys_mmap_pgoff

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

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

文章目录 一、sys_mmap_pgoff 系统调用函数执行流程 二、sys_mmap_pgoff 系统调用函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的..." 整数倍 " , 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ; 一、sys_mmap_pgoff 系统调用函数执行流程 ---- 在 sys_mmap_pgoff..., 创建文件 " 巨型页 " , 即 anon_hugepage ; 最后 , 调用了 vm_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

系统调用mmap源码分析(基于linux1.2.13)

mmap涉及到操作系统底层很多知识,目前粗略介绍一下大概的逻辑,等深入理解后再继续。操作系统用vma链表管理内存,mmap就是申请一个新的vma供进程使用。...*/ // 调用文件系统mmap if (file) error = file->f_op->mmap(file->f_inode, file, vma); else // 匿名映射...如果是文件映射则调用文件系统mmap函数。否则建立一个匿名映射。下面我们接着看文件映射和匿名映射具体做了什么。首先看匿名映射。函数是anon_map。...mmap会执行文件系统mmap函数。文件系统mmap函数使用的是filemmap.c里的generic_mmap函数。...该函数由操作系统的缺页中断函数调用。接着我们看一下缺页中断时的处理,下面是缺页中断处理函数。

1.8K40

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

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 内核申请 读写 " 信号量..." 权限 ; 然后 , 如果 读写 " 信号量 " 权限 申请通过 , 那么调用 do_mmap_pgoff 函数 , 执行 创建 " 内存映射 " 的过程 , 特别注意 , 这是 创建 " 内存映射...函数源码 ---- vm_mmap_pgoff 函数定义在 Linux 内核源码中的 linux-4.12\mm\util.c#296 位置 ; vm_mmap_pgoff 函数源码如下 : unsigned

2K10

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

文章目录 一、mmap_region 函数执行流程 1、检查内存申请是否合法 2、创建 " 虚拟内存区域 " 二、mmap_region 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 "...是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ; 在 sys_mmap_pgoff 系统调用函数 中..., 最后调用了 vm_mmap_pgoff 函数 , 继续向下执行 ; 在 vm_mmap_pgoff 函数 中 , 核心处理过程就是调用 do_mmap 函数 , 这是 " 内存映射 " 创建的主要函数逻辑...-4.12\mm\mmap.c#1647 在创建 " 虚拟内存区域 " 时 , 如果命中 file 分支 , 则是 创建 " 文件映射 " 内存区域 , 核心是调用 调用 call_mmap 函数 ;...\mm\mmap.c#1743 二、mmap_region 函数源码 ---- mmap_region 函数源码 定义在 Linux 内核源码的 linux-4.12\mm\mmap.c#1602 位置

1.8K20

Linux 内核 内存管理】Linux 内核堆内存管理 ② ( 动态分配堆内存方式 | brk 系统调用 | mmap 系统调用 | brk 系统调用源码介绍 )

文章目录 一、Linux 系统 动态分配堆内存 方式 二、brk 系统调用 动态分配堆内存 一、Linux 系统 动态分配堆内存 方式 ---- Linux 系统中 , 提供了 2 种方式 进行 "...动态分配堆内存 " 操作 ; ① brk 系统调用 : 该方式本质是 设置 " 进程数据段 “ 的 结束地址 , 将该 ” 结束地址 " 向 高或低 移动 , 实现堆内存的 扩张或收缩 ; ② mmap...系统调用 : 向 Linux 操作系统 申请 " 虚拟地址空间 " 内存 , 并且将某个文件 " 映射 “ 到该申请的内存中 ; 如果 不需要映射文件 到该空间中 , 则该空间就是 ” 匿名空间 "..., 可作为 " 堆内存 " 使用 ; 二、brk 系统调用 动态分配堆内存 ---- " brk 系统调用 “ 可以指定 ” 堆内存 “ 在 ” 虚拟内存空间 “ 的 ” 结束地址 " ; 如果要 "...扩张 " 堆内存 , 可以将 结束地址 " 大于当前值 " , 如果要 " 收缩 " 堆内存 , 可以将 结束地址 " 小于当前值 " ; brk 系统调用 源码在 Linux 源码中的 linux-5.6.18

5.1K20

系统调用mmap的内核实现分析

也就是说,该内存段就是操作系统mmap系统调用新分配出来的区域。 由pmap的输出可以看到,该内存段的大小是4kb,实际物理内存占用(rss)是0。 实际物理内存占用为什么是0呢?...看下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

2.7K10

linux mmap

mmaplinux中提高文件读写效率的一种手段,这里简单整理一下mmap的原理和使用。 高速页缓存 在介绍文件读写之前需要先了解下页缓存的机制,有助于理解文件读写的底层实现。...在linux文件读写中,内核会将文件内容缓存到物理内存中,以页为单位进行映射。...看一下在文件的读写过程中操作系统都做了哪些操作: [af0c4045173bbff9a9f03c5fdf961c8e.jpeg] 可以看到在一次文件读写的过程中,发生了两次系统调用(四次内核态与用户态的上下文切换...--- mmap内存映射 mmap内存映射机制可以将文件的页缓存直接映射到用户空间进行读写,读写过程就和操作用户空间的内存一样,完美的避开了系统调用的上下文切换和数据拷贝。...若使用MAP_PRIVATE,则表示每个调用mmap的进程独有一块缓存(写时复制),对该内存的更新不会写入文件。

2.2K30

Linux mmap原理

Linux mmap原理 前言 Linux段页式内存管理 mmap mmap内存映射原理 文字概述 mmap函数参数介绍 源码解析 1. 文件映射 2....缺页异常 mmap 和常规文件操作的区别 mmap 使用的细节 小结 ---- 前言 mmaplinux操作系统提供给用户空间调用的内存映射函数,很多人仅仅只是知道可以通过mmap完成进程间的内存共享和减少用户态到内核态的数据拷贝次数...(作者本人并非主攻linux,所以只是对linux 0.11略有研究) 无论是现代操作系统还是最早的linux 0.11操作系统,在对于物理内存的管理,都是将物理内存按页划分,如下图所示:...调用 mmap() 系统调用对文件进行映射后,用户对映射后的内存进行读写实际上是对文件缓存的读写,所以减少了一次系统调用,从而加速了对文件读写的效率。...内存映射机制mmap是POSIX标准的系统调用,有匿名映射和文件映射两种。

3.5K21

LinuxLinux系统调用

Linux系统调用 前言 操作系统——管理计算机硬件与软件资源的软件,是用户和系统交互的操作接口,为它上面运行的程序提供服务。...操作系统内核——操作系统的内核,负责管理系统的进程、内存、设备驱动程序、文件和网络系统。一个内核不是一套完整的操作系统。例如LinuxLinux操作系统——基于Linux内核的操作系统。...Linux的运行空间: Linux的运行空间:内核空间+用户空间 ---- 内核空间——存放的是整个内核代码和所有内核模块,以及内核所维护的数据。 用户空间——用户程序的代码和数据。...---- 系统调用的实现 通过软件中断实现。 **软件中断:**它是通过软件指令触发的中断。Linux系统内核响应软件中断,从用户态切换到内核态,执行相应的系统调用。...调用相应的执行程序来处理系统调用。 从系统调用返回。 系统调用号: 每个系统调用被赋予一个系统调用号,与具体的系统调用相关联。

27.8K10

Linux 系统调用

Linux 中,系统调用是用户空间访问内核的唯一手段﹔除异常和陷入外,它们是内核唯一的合法入口。实际上,其他的像设备文件和/proc之类的方式,最终也还是要通过系统调用进行访问的。...而有趣的是,Linux 提供的系统调用却比大部分操作系统都少得多。 要访问系统调用(在 Linux 中常称作 syscall),通常通过C库中定义的函数调用来进行。...系统调用在出现错误的时候C库会把错误码写人errno全局变量。通过调用perror()库函数,可以把该变量翻译成用户可以理解的错误字符串。 在 Linux 中,每个系统调用被赋予一个系统调用号。...这样,通过这个独一无二的号就可以关联系统调用。当用户空间的进程执行一个系统调用的时候,这个系统调用号就用来指明到底是要执行哪个系统调用;进程不会提及系统调用的名称。...假设系统调用在内核空间定义为 sys_ioctl,那么该系统调用的用户空间接口为 ioctl Linux kernel-5.18.8 有 440 个系统调用,这些系统调用讲究通用性,一旦固定,很少修改,

9.8K20

Linux内存映射——mmap

Linux提供了mmap()函数,用来映射物理内存。...2.mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。...当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.但需注意,直接对该段内存写时不会写入超过当前文件大小的内容....二 系统调用mmap()用于共享内存的两种方式 (1)使用普通文件提供的内存映射:适用于任何进程之间;此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下: fd=open(name...,为映射做准备(由内核mmap系统调用完成) 每个进程拥有3G字节的用户虚存空间。

5.6K10

Linux 内核 内存管理】内存管理系统调用 ② ( mmap 创建内存映射 | mmap 创建内存映射 与 malloc 申请内存对比 | mmap 创建内存映射 与 普通文件操作对比 )

的 内存管理函数 调用 " Linux 内核 " 中的 kmalloc vmalloc 函数 ; 参考 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc...申请的内存大小 小于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 brk 系统调用 , 向 Linux 内核申请内存 ; 使用 mmap 系统调用 : 如果 应用程序...申请的内存大小 大于等于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 mmap 系统调用 , 向 Linux 内核申请内存 ; 4、mmap 创建内存映射 mmap...可以直接向 Linux 内核申请 " 虚拟内存 " , 不需要经过 " 用户态 “ 与 ” 内核态 " 之间的转换 ; 二、mmap 创建内存映射 与 普通文件操作 对比 ---- 使用 mmap 系统调用...内核模式 下调用 Linux 内核中相应的文件操作 , 这里 涉及到 用户模式 和 内核模式 之间的 切换 ; 使用 mmap 系统调用 , 避免了 用户模式 与 内核模式 切换的开销 , 提高了文件操作的性能

6.1K20

Linux 内核 内存管理】内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )

文章目录 一、进程一描述 二、进程二描述 三、mmap 进程共享内存展示 一、进程一描述 ---- 在上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射...; 二、进程二描述 ---- 进程二 的源码 , 与上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 进程一...\n"); return 0; } 上述源码 , 放在 mmap_demo_02.c 文件中 , 执行 gcc mmap_demo_02.c -o mmap_demo_02 命令 , 编译该源码..., 编译出的可执行文件为 mmap_demo_02 ; 三、mmap 进程共享内存展示 ---- 先执行 进程一 mmap_demo_01 可执行程序 , 进程一 中通过 mmap 文件映射向文件中写出数据后..., 进入休眠阶段 , 再执行进程二 mmap_demo_02 , 使用 mmap 文件映射访问 file 文件 , 此时打印出 进程一 中通过 mmap 文件映射写出的文件数据 ;

3.5K30

Linux系统调用原理

一、什么是系统调用 系统调用 跟用户自定义函数一样也是一个函数,不同的是 系统调用 运行在内核态,而用户自定义函数运行在用户态。...系统调用Linux 内核提供的一段代码(函数),其实现了一些特定的功能,用户可以通过 int 0x80 中断(x86 CPU)或者 syscall 指令(x64 CPU)来调用 系统调用。...二、进入系统调用 本文主要介绍的是 x86 CPU 进入系统调用的方式 Linux 提供了 int 0x80 中断来让用户程序进入 系统调用,我们来看看 Linux 对 int 0x80 中断的处理初始化过程...三、系统调用实现 当用户要调用 系统调用 时,需要通过向 eax 寄存器写入要调用系统调用 编号。...而 Linux 进入中断处理程序时,会把这些寄存器的值保存到内核栈中,这样 系统调用 就能通过内核栈来获取到参数。

4.2K30

Linux系统编程-进程间通信(mmap内存映射)

内存映射mmap函数介绍 mmap函数可以将磁盘上的文件映射到内存空间中,返回映射的首地址。...(1) 第一个参数start指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回。 (2) 第二个参数length代表将文件中多大的部分对应到内存。...在调用mmap()时必须要指定MAP_SHARED 或MAP_PRIVATE。 (5) 第五个参数fd为open()返回的文件描述词,代表欲映射到内存的文件。...演示通过mmap映射文件地址方式读写文件。...案例代码: mmap用法示例(2) 下面代码的功能: 程序运行时,从命令行传入一个存在的文件路径进去,再调用open打开文件,再通过mmap映射文件地址,得到地址之后向文件拷贝一串字符串数据进去。

1.4K31

Linux mmap完全剖析

mmap() 系统调用介绍 mmap() 系统调用能够将文件映射到内存空间,然后可以通过读写内存来读写文件。...我们先来看看 mmap() 系统调用的用法吧,mmap() 函数的原型如下: void *mmap(void *start, size_t length, int prot, int flags, int...mmap() 底层原理 在分析 mmap() 系统调用原理之前,首先要知道操作系统的虚拟内存空间与物理内存空间的概念。...然后调用文件对象的 mmap 接口来对 vm_area_struct 结构的 vm_ops 成员进行初始化,如 ext2 文件系统的文件对象会调用 generic_file_mmap() 函数进行初始化...而调用 mmap() 系统调用对文件进行映射后,用户对映射后的内存进行读写实际上是对文件缓存的读写,所以减少了一次系统调用,从而加速了对文件读写的效率。如下图: ?

2.5K10

Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 )

文章目录 一、mmap 创建内存映射代码示例 1、fopen 打开或创建文件 2、lseek 设置文件大小 3、mmap 函数使用 4、munmap 删除内存映射 二、完整代码示例 一、mmap 创建内存映射代码示例...函数使用 调用 mmap 函数 , 创建文件映射 , 相关参数作用如下 : NULL : 映射区的开始地址 sizeof(student) * 1 : 文件映射区的长度 PROT_READ | PROT_WRITE...; return -1; } // 创建完文件映射之后 , 文件描述符就可以释放了 close(fd); 4、munmap 删除内存映射 调用 munmap 函数.../mmap_demo_01 file 命令 , 开始执行该应用程序 ; 执行结果如下 : han@ubuntu:~/vscode/mmap$ gcc mmap_demo_01.c -o mmap_demo.../mmap_demo_01 file 文件初始化完毕 ! mmap 文件映射展示完毕 ! han@ubuntu:~/vscode/mmap$

1.4K10
领券