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

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

文章目录 一、mmap 创建内存映射代码示例 1、fopen 打开或创建文件 2、lseek 设置文件大小 3、mmap 函数使用 4、munmap 删除内存映射 二、完整代码示例 一、mmap 创建内存映射代码示例..., 相关参数作用如下 : NULL : 映射区的开始地址 sizeof(student) * 1 : 文件映射区的长度 PROT_READ | PROT_WRITE : 内存保护的标志位 , 该内存页的内容可以...// PROT_READ | PROT_WRITE : 内存保护的标志位 , 该内存页的内容可以 读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间..., 该内存页的内容可以 读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间 // fd : 文件描述符 , 被映射的文件 //..., 该内存是文件映射内存 // 拷贝内存的同时 , 也会修改文件内容 memcpy((*(p_student + i)).name, &name_char, 1);

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

【Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 )

文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存页 2、产生缺页异常 3、分配物理内存页 三、共享内存 四、进程内存段的内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "...内存映射 “ 就是在 进程的 ” 用户虚拟地址空间 " 中 , 创建一个 映射 , " 内存映射 " 有 2 种情况 , ① 文件映射 , ② 匿名映射 ; 文件映射 : 有 文件 支持 的 内存映射..." 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存页 分配 虚拟内存页 : 在 Linux 系统中 创建 " 内存映射 “ 时...缺页异常 " 后 , 会 分配 " 物理内存页 “ , 并且将 要映射的文件 的 部分数据 读取到 该 ” 物理内存页 " 中 ; 匿名映射 : 对于 " 匿名映射 " , 直接分配 " 物理内存页 “..., 并且在 " 页表 “ 中 , 将 ” 虚拟内存页 " 映射到 ” 物理内存页 " ; 三、共享内存 ---- 内存映射 与 共享内存 关系 : 文件映射 : 在进程间的 " 共享内存 " 就是使用

7.9K20

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

文章目录 一、mmap 创建内存映射 与 malloc 申请内存对比 1、malloc 函数原型 2、malloc 申请动态内存过程 3、malloc 使用的系统调用判定 ( brk | mmap )...4、mmap 创建内存映射 二、mmap 创建内存映射 与 普通文件操作 对比 一、mmap 创建内存映射 与 malloc 申请内存对比 ---- 1、malloc 函数原型 C 标准库 stdlib.h..." , glibc 库 的 " 内存分配器 " ptmalloc , 负责调用 系统接口层 的 brk sbrk mmap munmap 等系统调用 申请内存 ; ② 系统调用 : 用户空间 的 内存管理函数...; 4、mmap 创建内存映射 mmap 可以直接向 Linux 内核申请 " 虚拟内存 " , 不需要经过 " 用户态 “ 与 ” 内核态 " 之间的转换 ; 二、mmap 创建内存映射 与 普通文件操作...与 内核模式 切换的开销 , 提高了文件操作的性能 ; 此外 , 多个进程之间 , 可以使用 mmap 系统调用 创建 共享的 " 文件映射 “ 类型的 ” 内存映射 “ , 进而实现了 ” 共享内存操作

5.8K20

【Linux 内核 内存管理】内存管理系统调用 ① ( mmap 创建内存映射 | munmap 删除内存映射 | mprotect 设置虚拟内存区域访问权限 )

文章目录 一、mmap 创建内存映射 二、munmap 删除内存映射 三、mprotect 设置虚拟内存区域访问权限 一、mmap 创建内存映射 ---- mmap 系统调用函数 , 用于 创建 " 内存映射..." ; 该 " 系统调用 " 函数工作原理如下 : 首先 , 创建 " 匿名内存映射 “ , 将 ” 物理内存页 “ 映射到 进程的 ” 用户虚拟地址空间 " 中 ; 然后 , 将 指定文件 的 指定数据区间..., 避免了 用户模式 与 内核模式 切换的开销 , 提高了文件操作的性能 ; 此外 , 多个进程之间 , 可以使用 mmap 系统调用 创建 共享的 " 文件映射 “ 类型的 ” 内存映射 “ , 进而实现了...” 共享内存操作 " ; 二、munmap 删除内存映射 ---- munmap 系统调用 的作用是 删除内存映射 , 其函数原型如下 : #include int munmap...(void* start,size_t length); 三、mprotect 设置虚拟内存区域访问权限 ---- mprotect 系统调用 的作用是 设置虚拟内存区域访问权限 , 其函数原型如下 :

1.2K20

操作系统:图文详解神秘的”内存映射

在 Linux操作系统中非常重要,因为其涉及到高效的跨进程通信 & 文件操作 今天,我将详细讲解操作系统中核心概念:内存映射 ---- 目录 ?...实现过程 内存映射的实现过程主要是通过Linux系统下的系统调用函数:mmap() 该函数的作用 = 创建虚拟内存区域 + 与共享对象建立映射关系 其函数原型、具体使用 & 内部流程 如下 /**...应用场景 在Linux系统下,根据内存映射的本质原理 & 特点,其应用场景在于: 实现内存共享:如 跨进程通信 提高数据读 / 写效率 :如 文件读 / 写操作 ---- 6....实例讲解 下面,我将详细讲解 内存映射应用在跨进程通信 & 文件操作的实例 6.1 文件读 / 写操作 传统的Linux系统文件操作流程如下 ? 使用了内存映射的 文件读 / 写 操作 ?...总结 本文全面讲解了 Linux操作系统中的内存映射 下面我将继续讲解 编程开发的基础知识,有兴趣可以继续关注Carson_Ho的开发笔记 ---- 请点赞 / 评论点赞!

1.2K20

漫画解说 “内存映射

虚拟内存空间与物理内存空间 虚拟内存地址就好比每个班的学号,而物理内存地址就好比真实的学生。因为每个学号都对应不同的学生,所以虚拟内存地址也要映射到物理内存地址。...虚拟内存与物理内存映射关系是通过 页表 来关联的,如下图: 但 页表 并不是按字节来进行映射的,而是按照 内存页 为单位进行映射,一般一个 内存页 的大小为 4KB(为什么要加一般呢,这是因为除了4KB...也就是说,0 ~ 4095 的虚拟内存地址都是使用 页表 的第一个 页表项 来映射的,而 4096 ~ 8191 的虚拟内存地址使用 页表 的第二个 页表项 来映射的,以此类推......现在对内存映射的原理有了比较清晰的了解了,但现在有个问题,每个进程都要 1MB 大小的页表,那不是很浪费内存吗?...把原来的 页表 划分为两级后,进程有些不使用的虚拟内存地址就不需要进行映射,从而节省了内存的使用。

81940

内存映射技术分析

考虑到MMIO比PIO复杂很多,涉及更多的概念,作者打算先分析几篇基本的Linux的内存管理概念,再来分析MMIO。 作者大概想了一下,主要由这几篇构成: 1,虚拟内存管理和内存映射。...linux-4.0.4/mm/mmap.c中实现了brk、mmap、munmap、mremap系统调用。...结合上面的数据结构,仔细阅读这几个系统调用的实现,大致可以看懂vma的申请、释放、合并、拆分管理。 4,物理内存 在shell中敲dmesg: ?...据一位懂BIOS的人和我说,BIOS中也可以配置一次,再做一次映射~ 5,内存映射 看上面例子中的虚拟地址空间,和物理地址范围,二者其实不是对应的。...后记: 因为这里主要是给后面的MMIO做铺垫,所以在这里就没有详细介绍Linux的内存映射技术。

2.2K110

Linux内存映射——mmap

一 mmap系统调用 1.内存映射 所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率。...2.mmap系统调用 mmap将一个文件或者其它对象映射内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。...:已达到系统对打开文件的限制 ENODEV:指定文件所在的文件系统不支持内存映射 ENOMEM:内存不足,或者进程已超出最大内存映射数量 EPERM:权能不足,操作不允许 ETXTBSY:已写的方式打开文件...二 系统调用mmap()用于共享内存的两种方式 (1)使用普通文件提供的内存映射:适用于任何进程之间;此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下: fd=open(name...因为保留页和在物理内存顶之上的物理地址内存管理系统的各个子模块管理不到。640 KB 和 1MB 是保留页可能映射,设备I/O内存也可以映射

5.4K10

高端内存映射之kmap持久内核映射--Linux内存管理(二十)

内核通常会成功,因为大部分大的内存块都在启动时分配给内核,那时内存的碎片尚不严重。但在已经运行了很长时间的系统上, 在内核需要物理内存时, 就可能出现可用空间不连续的情况....内核中, 将内存划分为各个区域是通过图3-15所示的各个常数控制的。根据内核和系统配置, 这些常数可能有不同的值。直接映射的边界由high_memory指定。...即内核对于低端内存, 不需要特殊的映射机制, 使用直接映射即可以访问普通内存区域, 而对于高端内存区域, 内核可以采用三种不同的机制将页框映射到高端内存 : 分别叫做永久内核映射、临时内核映射以及非连续内存分配...当分配项的值等于0时为自由项,等于1时为缓冲项,大于1时为映射项。映射页面的分配基于分配表的扫描,当所有的自由项都用完时,系统将清除所有的缓冲项,如果连缓冲项都用完时,系统将进入等待状态。...映射页面的分配基于分配表的扫描,当所有的自由 项都用完时,系统将清除所有的缓冲项,如果连缓冲项都用完时,系 统将进入等待状态。

3.3K10

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

文章目录 一、进程一描述 二、进程二描述 三、mmap 进程共享内存展示 一、进程一描述 ---- 在上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射...| munmap 删除内存映射 ) 中 , 完成了 进程一 的程序 , 在该进程中 , 创建并打开文件 , 为该文件设置大小 , 使用 mmap 创建 " 文件映射 " , 并通过直接访问内存的方式...; 二、进程二描述 ---- 进程二 的源码 , 与上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 进程一...// NULL : 映射区的开始地址 // sizeof(student) * 1 : 文件映射区的长度 // PROT_READ | PROT_WRITE : 内存保护的标志位..., 该内存页的内容可以 读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间 // fd : 文件描述符 , 被映射的文件 //

3.3K30

3、mmap(内存映射、共享)

mmap:内存映射(内存、用户缓冲区共享一块映射数据) 直接将磁盘文件数基于DMA引擎拷贝据映射到内核缓冲区,同时用户缓冲区是跟内核缓冲区共享一块映射数据, 建立映射后,不需要从内核缓冲区拷贝到用户缓冲区...传统IO,read() 系统调用的过程中会把内核缓冲区的数据拷贝到用户的缓冲区里,为了减少这一步开销,我们可以用 mmap() 替换 read() 系统调用函数。...mmap() 系统调用函数会直接把内核缓冲区里的数据映射到用户空间,这样,操作系统内核与用户空间共享缓冲区,就不需要再进行任何的数据拷贝操作。...接着,应用进程跟操作系统内核「共享」这个缓冲区;2、第二次拷贝:应用进程再调用 write(),操作系统直接将内核缓冲区的数据拷贝到 socket 缓冲区中,这一切都发生在内核态,由 CPU 来搬运数据

10600

Linux内核编程--内存映射和共享内存

文件的内存映射示意图: 对于用户进程和内核进程: 将用户进程的一段内存区域映射到内核进程,映射成功后,用户进程对这段内存区域的修改直接反映到内核空间,同样,内核进程对这段内存区域的修改也直接反映到用户空间...没有内存映射的I/O操作示意图: 磁盘->内核空间->用户空间 有内存映射的I/O操作示意图:少了一个copy操作 内存映射的优点: 减少了拷贝次数,节省I/O操作的开支 用户空间和内核空间可以直接高效交互...step2: 进程a通过磁盘文件创建内存映射区 step3: 进程b通过磁盘文件创建内存映射区 step4: 进程a和进程b共同修改内存映射区实现进程通信 *基于内存映射区的进程间通信,是非阻塞的。...: 内存映射和共享内存的区别: 1.内存映射与文件关联,共享内存不需要与文件关联,把共享内存理解为内存上的一个匿名片段。...一般用信号量来同步共享内存的访问。 共享内存区在系统存储中的位置: 为什么要用共享内存: 对于涉及到内核操作的,内核和进程之间,经历了四次复制操作,开销很大。

5.7K10

iOS文件内存映射——MMAP

在操作系统层面,当App读取一个文件时,实际是有两步:先将文件从磁盘读取到物理内存,再从系统空间拷贝到用户空间(可以认为是复制到系统给App统一分配的内存)。...iOS系统使用页缓存机制,通过MMU(Memory Management Unit)将虚拟内存地址和物理地址进行映射,并且由于进程的地址空间和系统的地址空间不一样,所以还需要多一次拷贝。...而mmap将磁盘上文件的地址信息与进程用的虚拟逻辑地址进行映射,建立映射的过程与普通的内存读取不同:正常的是将文件拷贝到内存,mmap只是建立映射而不会将文件加载到内存中。...,设置NULL则让系统决定映射开始地址; length:映射区域的长度,单位是Byte; prot:映射内存的保护标志,主要是读写相关,是位运算标志;(记得与下面fd对应句柄打开的设置一致) flags...,通常读取文件是将文件读取到内存,会占用真正的物理内存;而mmap是用进程的内存虚拟地址空间去映射实际的文件中,这个过程由操作系统处理。

1.6K20

linux系统调用函数 mmap--创建内存映射区(在虚拟地址空间上)munmap--释放内存映射

第五个参数是文件描述符fd,要映射的文件对应的文件描述符fd。使用open系统调用获取文件描述符。...第六个参数off_t offset映射文件指针的偏移量,偏移量必须是4KB的整数倍,一般传入0即可,除非有特殊的需求。 返回值: 成功时,返回内存映射区的首地址。...功能: 将磁盘文件的数据映射内存,用户通过修改内存就能修改磁盘文件。 (1)使用普通文件提供的内存映射: 适用于任何进程之间。...对于具有亲缘关系的进程实现共享内存最好的方式应该是采用匿名内存映射的方式。此时,不必指定具体的文件,只要设置相应的标志即可。...fcntl.h> int main(){ //打开一个文件 int fd = open("a.txt",O_RDWR); int len = lseek(fd,0,SEEK_END); //创建内存映射

1.3K20
领券