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

Linux内存映射——mmap

一 mmap系统调用 1.内存映射 所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率。...Linux提供了mmap()函数,用来映射物理内存。...struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表....因为保留页和在物理内存顶之上的物理地址内存管理系统的各个子模块管理不到。640 KB 和 1MB 是保留页可能映射,设备I/O内存也可以映射。...完成映射过程。remap_pfn_range不能对常规内存映射,只能对保留的内存与物理内存之外的进行映射。 2.在这里,要分清几个地址,一个是物理地址,这个很简单,就是物理内存的实际地址。

5.5K10

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

文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存页 2、产生缺页异常 3、分配物理内存页 三、共享内存 四、进程内存段的内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "...内存映射 “ 就是在 进程的 ” 用户虚拟地址空间 " 中 , 创建一个 映射 , " 内存映射 " 有 2 种情况 , ① 文件映射 , ② 匿名映射 ; 文件映射 : 有 文件 支持 的 内存映射..." 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存页 分配 虚拟内存页 : 在 Linux 系统中 创建 " 内存映射 “ 时..., 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 2、产生缺页异常 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问..., 并且在 " 页表 “ 中 , 将 ” 虚拟内存页 " 映射到 ” 物理内存页 " ; 三、共享内存 ---- 内存映射 与 共享内存 关系 : 文件映射 : 在进程间的 " 共享内存 " 就是使用

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

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

1 高端内存与内核映射 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途....永久内存映射区 该区域可访问高端内存. 访问方法是使用alloc_page(_GFP_HIGHMEM)分配高端内存页或者使用kmap函数将分配到的高端内存映射到该区域....即内核对于低端内存, 不需要特殊的映射机制, 使用直接映射即可以访问普通内存区域, 而对于高端内存区域, 内核可以采用三种不同的机制将页框映射到高端内存 : 分别叫做永久内核映射、临时内核映射以及非连续内存分配...如果确实在高端内存中, 则内核将工作委托给kmap_high kmap_high的实现在函数mm/highmem.c?...如果它不对应到有效地址, 则必须使用map_new_virtual映射该页. 该函数定义在mm/highmem.c?

3.3K10

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

文件的内存映射示意图: 对于用户进程和内核进程: 将用户进程的一段内存区域映射到内核进程,映射成功后,用户进程对这段内存区域的修改直接反映到内核空间,同样,内核进程对这段内存区域的修改也直接反映到用户空间...没有内存映射的I/O操作示意图: 磁盘->内核空间->用户空间 有内存映射的I/O操作示意图:少了一个copy操作 内存映射的优点: 减少了拷贝次数,节省I/O操作的开支 用户空间和内核空间可以直接高效交互...step2: 进程a通过磁盘文件创建内存映射区 step3: 进程b通过磁盘文件创建内存映射区 step4: 进程a和进程b共同修改内存映射区实现进程通信 *基于内存映射区的进程间通信,是非阻塞的。...2.文件读写操作 step1: 读磁盘文件,获得文件描述符 step2: 基于文件描述符建立进程的内存映射区 step3: 利用进程进行内存映射区的读写操作 step4: 释放内存映射区,关闭文件描述符...: 内存映射和共享内存的区别: 1.内存映射与文件关联,共享内存不需要与文件关联,把共享内存理解为内存上的一个匿名片段。

5.8K10

c# 通过内存映射实现文件共享内存

内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用c语言的 memcpy等内存操作的函数。...这种方法能够很好的应用在需要频繁处理一个文件或者是一个大文件的场合,这种方式处理IO效率比普通IO效率要高 共享内存内存映射文件的一种特殊情况,内存映射的是一块内存,而非磁盘上的文件。...MemoryMappedFiles命名空间,这个命名空间的类对windows 共享内存相关API做了封装,使.Net程序员可以更方便的使用内存映射文件。 在C#中使用共享内存。...System.Collections.Generic;android从资源文件中读取文件流显示 using System.Linq; using System.Text; using System.IO; //引用内存映射文件命名空间...using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //引用使用内存映射文件需要的命名空间

1.7K20

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 : 文件描述符 , 被映射的文件 //...\n"); return 0; } 编译并执行代码 : 上述源码保存在 mmap_demo_01.c 文件中 , 执行 gcc mmap_demo_01.c -o mmap_demo_01 命令

1.4K10

Linux内存映射函数mmap与匿名内存

mmap也可以直接映射匿名内存块,无需提供文件fd,直接申请一块内存给当前进程使用,也可以选择继承给子进程。注意匿名映射不会真的创建文件,只是拿到了一块填充0的内存。...与共享内存这种传统IPC相比,mmap匿名内存更为灵活,Postgresql使用的共享内存全部是用mmap申请的,只用共享内存申请一个PGShmemHeader结构的大小。...2 文件映射实例 gcc -o main1 -Wall -g -ggdb -O0 -g3 -gdwarf-2 main1.c #include #include <sys/stat.h...MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。 MAP_HUGETLB 使用内存大页。...匿名映射的优点: 没有虚拟地址空间碎片,取消映射后,内存立即归还给系统。 与全局堆分开。 可以给子进程继承使用。 匿名映射的缺点: 不能调整大小!

1.9K30

kmalloc分配物理内存与高端内存映射--Linux内存管理(十八)

持久映射用于将高端内存域中的非持久页映射到内核中 固定映射是与物理地址空间中的固定页关联的虚拟地址空间项,但具体关联的页帧可以自由选择....它与通过固定公式与物理内存关联的直接映射页相反,虚拟固定映射地址与物理内存位置之间的关联可以自行定义,关联建立后内核总是会注意到的. ?...永久内存映射区 该区域可访问高端内存. 访问方法是使用alloc_page(_GFP_HIGHMEM)分配高端内存页或者使用kmap函数将分配到的高端内存映射到该区域....v=4.7, line 60 include/linux/slab.h, line 466 include/linux/slab.h?v=4.7, line 620 mm/slob.c?...v=4.7, line 484 mm/slub.c?v=4.7, line 3645 mm/slab.c?

6.3K21

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

Linux下的进程间通信也可以使用mmap的内存共享映射来实现,mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中,那么进程就可以直接对该内存文件进行操作,mmap也设置了两种机制...:共享和私有,如果是共享映射,那么在内存中对文件进行修改,磁盘中对应的文件也会被修改,相反,磁盘中的文件有了修改,内存中的文件也被修改。...如果是私有映射,那么内存中的文件是独立的,二者进行修改都不会对对方造成影响。...通过这样的内存共享映射就相当于是进程直接对磁盘中的文件进行读写操作一样,那么如果有两个进程来mmap同一个文件,就实现了进程间的通信。...当进程终止时,该进程的映射内存会自动解除,也可以调用munmap解除映射,解除成功返回0,出错返回-1。那么这些参数对应着下图: ?

7.8K30

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

4、mmap 创建内存映射 二、mmap 创建内存映射 与 普通文件操作 对比 一、mmap 创建内存映射 与 malloc 申请内存对比 ---- 1、malloc 函数原型 C 标准库 stdlib.h...调用 " Linux 内核 " 中的 kmalloc vmalloc 函数 ; 参考 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free |...小于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 brk 系统调用 , 向 Linux 内核申请内存 ; 使用 mmap 系统调用 : 如果 应用程序 申请的内存大小...大于等于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 mmap 系统调用 , 向 Linux 内核申请内存 ; 4、mmap 创建内存映射 mmap 可以直接向 Linux...“ 类型的 ” 内存映射 “ , 进而实现了 ” 共享内存操作 " ;

6K20

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

文章目录 一、mmap 创建内存映射 二、munmap 删除内存映射 三、mprotect 设置虚拟内存区域访问权限 一、mmap 创建内存映射 ---- mmap 系统调用函数 , 用于 创建 " 内存映射..." ; 该 " 系统调用 " 函数工作原理如下 : 首先 , 创建 " 匿名内存映射 “ , 将 ” 物理内存页 “ 映射到 进程的 ” 用户虚拟地址空间 " 中 ; 然后 , 将 指定文件 的 指定数据区间...映射到 " 用户虚拟地址空间 " 中 ; 此时 , 可以通过 指针 访问 内存的方式 , 访问文件 ; mmap 函数原型如下 : #include void* mmap(void...对比 : 传统的文件操作 , 首先调用 fopen 函数打开文件 , 然后调用 fread fwrite 等函数操作文件 , 这些操作 在 用户模式 下调用 , 然后需要 切换到 内核模式 下调用 Linux...“ 类型的 ” 内存映射 “ , 进而实现了 ” 共享内存操作 " ; 二、munmap 删除内存映射 ---- munmap 系统调用 的作用是 删除内存映射 , 其函数原型如下 : #include

1.2K20

Linux 内核 内存管理】内存映射相关数据结构 ⑥ ( 文件映射 虚拟内存区域 | vm_area_struct | vm_operations_struct | 匿名映射 虚拟内存区域 )

文章目录 一、文件映射 虚拟内存区域 1、文件映射 虚拟内存区域 的 vm_ops 成员 2、文件映射 虚拟内存区域 的 vm_file 成员 3、文件映射 虚拟内存区域 图示 二、匿名映射 虚拟内存区域...一、文件映射 虚拟内存区域 ---- " 文件映射 " 的 " 虚拟内存区域 " vm_area_struct 结构体 的 数据结构表示形式如下 ; 1、文件映射 虚拟内存区域 的 vm_ops 成员...deal with this struct. */ const struct vm_operations_struct *vm_ops; 参考 【Linux 内核 内存管理】内存映射相关数据结构 ④...we map to (can be NULL). */ 参考 【Linux 内核 内存管理】内存映射相关数据结构 ⑤ ( vm_area_struct 结构体成员分析 | vm_pgoff 成员 |...vm_file 成员 | vm_private_data ) 博客 ; 3、文件映射 虚拟内存区域 图示 二、匿名映射 虚拟内存区域 ---- 在 " 匿名映射 " 虚拟内存区域 中 , 与 " 文件映射

98530

通过Linux设备映射器使用持久内存设备

通过Linux设备映射器使用持久内存设备 IO Alignment Considerations 传统的存储设备例如HDD,SSD,nvme,SAN LUNS等以blocks为单位提供存储功能。...持久内存设备可以通过虚拟内存系统访问,因此IO可以使用系统页大小进行对齐。位于CPU上的内存管理单元(MMU)决定可能的页面大小。Linux支持两种页大小: Ø 默认页大小,通常4KB。...Linux通常将其作为页表条目。 Ø 大页:需要内核支持配置CONFIG_HUBETLB_PAGE和CONFIG_HUGETLBFS。...DDR和持久内存模块之间的容量差异相当大,由于上述原因,内存为TB级的系统上使用较小页面可能会对性能带来负面影响。...Verifying IO Alignment 需满足下面条件,DAX文件系统才能支持2M大页: Ø mmap()至少映射2M Ø 文件系统块分配的大小至少2M Ø 文件系统块分配必须与mmap具有相同的对齐方式

1.1K20
领券