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

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

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

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

漫画解说 “内存映射

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

84640

内存映射技术分析

考虑到MMIO比PIO复杂很多,涉及更多的概念,作者打算先分析几篇基本的Linux的内存管理概念,再来分析MMIO。 作者大概想了一下,主要由这几篇构成: 1,虚拟内存管理和内存映射。...据一位懂BIOS的人和我说,BIOS中也可以配置一次,再做一次映射~ 5,内存映射 看上面例子中的虚拟地址空间,和物理地址范围,二者其实不是对应的。...linux会组织起来一个数据叫做page table(传说中的页表),把虚拟内存和物理内存之间的映射关系保存到page table中,再把page table的地址告诉MMU,MMU就可以在CPU访问虚拟地址的时候...remap_pfn_range是关键函数:函数中实现了pud、pmd、pte的运算,并把物理内存的地址填入pte中。 仔细,完整的阅读remap_pfn_range函数,大概就了解内存映射了。...后记: 因为这里主要是给后面的MMIO做铺垫,所以在这里就没有详细介绍Linux的内存映射技术。

2.2K110

Linux内存映射——mmap

在驱动程序中,应用程序以设备文件为对象,调用mmap()函数,内核进行内存映射的准备工作,生成vm_area_struct结构体,然后调用设备驱动程序中定义的mmap函数。...2.mmap系统调用 mmap将一个文件或者其它对象映射内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。...munmap执行相反的操作,删除特定地址区域的对象映射。...不执行预读,只为已存在于内存中的页面建立页表入口。 fd:有效的文件描述词。如果MAP_ANONYMOUS被设定,为了兼容问题,其值应为-1。 offset:被映射对象内容的起点。...数据段中包括了所有静态分配的数据空间,即全局变量和所有申明为static的局部变量,这些空间是进程所必需的基本要求,这些空间是在建立一个进程的运行映像时就分配好的。

5.6K10

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

1 高端内存与内核映射 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途....永久内存映射区 该区域可访问高端内存. 访问方法是使用alloc_page(_GFP_HIGHMEM)分配高端内存页或者使用kmap函数将分配到的高端内存映射到该区域....即内核对于低端内存, 不需要特殊的映射机制, 使用直接映射即可以访问普通内存区域, 而对于高端内存区域, 内核可以采用三种不同的机制将页框映射到高端内存 : 分别叫做永久内核映射、临时内核映射以及非连续内存分配...字段 描述 page 是一个指向全局mem_map数组中的page实例的指针 virtual 指定了该页在内核虚拟地址空间中分配的位置 为便于组织, 映射保存在散列表中, 结构中的链表元素用于建立溢出链表...flush_cache_kmaps在内核映射上执行刷出(在需要显式刷出的大多数体系结构上,将使用flush_cache_all刷出CPU的全部的高速缓存), 因为内核的全局页表已经修改.

3.3K10

【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.4K10

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

一,内存映射 对于磁盘文件和进程: 将一个文件或其它对象映射到进程地址空间,实现文件在磁盘的存储地址和进程地址空间中一段虚拟地址的映射关系。...offset); start:用户进程中要映射的某段内存区域的起始地址,通常为NULL(由内核来指定) length:要映射内存区域的大小 prot:期望的内存保护标志 flags:指定映射对象的类型...2.内存映射可以通过fork继承给子进程,共享内存不可以。 3.文件打开的函数不同,内存映射文件由open函数打开,共享内存对象由shm_open函数打开。...length) 处理mmap的时候,普通文件或共享内存对象的大小都可以通过调用ftruncate修改。...若失败,返回-1 两个版本的微小差异:Posix共享内存对象的大小可在任意时刻由ftruncate函数修改,System V共享内存对象的大小是在调用shmget创建时固定下来的。

5.9K10

iOS文件内存映射——MMAP

iOS系统使用页缓存机制,通过MMU(Memory Management Unit)将虚拟内存地址和物理地址进行映射,并且由于进程的地址空间和系统的地址空间不一样,所以还需要多一次拷贝。...而mmap将磁盘上文件的地址信息与进程用的虚拟逻辑地址进行映射,建立映射的过程与普通的内存读取不同:正常的是将文件拷贝到内存,mmap只是建立映射而不会将文件加载到内存中。...,设置NULL则让系统决定映射开始地址; length:映射区域的长度,单位是Byte; prot:映射内存的保护标志,主要是读写相关,是位运算标志;(记得与下面fd对应句柄打开的设置一致) flags...:映射类型,通常是文件和共享类型; fd:文件句柄; off_toffset:被映射对象的起点偏移; 读写的例子如下: #import "ViewController.h" #import <sys/mman.h...,通常读取文件是将文件读取到内存,会占用真正的物理内存;而mmap是用进程的内存虚拟地址空间去映射实际的文件中,这个过程由操作系统处理。

1.6K20

【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 " 内存分配器 " 会使用 mmap 系统调用 , 向 Linux 内核申请内存 ; 4、mmap 创建内存映射 mmap 可以直接向 Linux...内核申请 " 虚拟内存 " , 不需要经过 " 用户态 “ 与 ” 内核态 " 之间的转换 ; 二、mmap 创建内存映射 与 普通文件操作 对比 ---- 使用 mmap 系统调用 与 传统文件 操作...“ 类型的 ” 内存映射 “ , 进而实现了 ” 共享内存操作 " ;

6.1K20

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

Python内存映射文件读写方式

使用 mmap 模块实现对文件的内存映射,让我们读写二进制文件像操作数组一样高效优雅。 先给出一个实用函数,用来演示如何打开一个文件并对它进行内存映射操作。...,它返回的mmap对象可以让我们像操作数组一样读写二进制文件!...需要强调的是,对某个文件进行内存映射并不会导致将整个文件读到内存中。也就是说,文件并不会拷贝到某种内存缓冲区或数组上。相反,操作系统只是为文件内容保留一段虚拟内存而已。...如果有多个Python解释器对同一个文件做了内存映射,得到的mmap对象可以用来在解释器之间交换数据。...以上这篇Python内存映射文件读写方式就是小编分享给大家的全部内容了,希望能给大家一个参考。

2.2K20

深入理解内存映射mmap

一个vm_area_struct映射到一组连续的页表项。页表项又指向物理内存page,这样就把一个文件和物理内存页相映射。...anon_vma_node, anon_vma处理匿名文件共享内存映射的情况,映射到同一物理内存页的映射都保存在一个链表中 vm_pgoff, vm_file都是处理有后备文件内存映射的情况,获得该映射在文件的页偏移量...而mmap是C标准库提供给用户程序的一个函数来使用内存映射,建立起文件地址空间和虚拟内存区域的映射关系。...,比如 后备文件的共享映射可以用作内存映射IO来对大文件进行操作,比普通IO减少一次复制。...小文件的读写使用普通IO更合适 后备文件的私有映射可以用作共享库二进制文件代码段,数据段的加载 匿名文件的共享映射可以用作fork时让父子进程共享匿名映射分配的内存 匿名文件的私有映射可以用作进程的私有内存分配

3K21

高端内存映射之kmap_atomic固定映射--Linux内存管理(二十一)

1 固定映射 1.1 数据结构 linux高端内存中的临时内存区为固定内存区的一部分, 对于固定内存在linux内核中有下面描述 x86 arm arm64 arch/x86/include/asm/fixmap.h...由于对应于ioremap的内存空间是有限的, 所以对于ioremap空间的使用遵照使用结束马上释放的原则....v=4.7#L55 void *kmap_atomic(struct page *page) page是一个指向高端内存页的管理结构的指针, 而早期的内核中, 增加了一个类型为enum km_type的...在很多体系结构中, 除非激活了内核抢占, 否则kunmap_atomic根本无事可做, 因为只有在下一个临时映射到来前上一个临时映射才有效....因此, 内核完全可以”忘掉”kmap_atomic映射, kunmap_atomic也无需做什么实际的事情. 下一个原子映射将自动覆盖前一个映射.

2.5K40

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

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

1.3K20
领券