内存学习(四):内存映射2

61 篇文章 38 订阅
订阅专栏

数据结构

1.虚拟内存

1-虚拟内存区域的主要成员

区域虚拟内存区域是分配给进程的一个虚拟地址范围,内核使用结构体vm_area_struct描述虚拟内存区域,虚拟内存区域的主要成员如表所示。
在这里插入图片描述

2-文件映射的虚拟内存区域

文件映射的虚拟内存区域如图所示。
在这里插入图片描述

  • (1)成员vm_file指向文件的一个打开实例(file)。索引节点代表一个文件,描述文件的属性。

  • (2)成员vm_pgoff存放文件的以页为单位的偏移。

  • (3)成员vm_ops指向虚拟内存操作集合,创建文件映射的时候调用文件操作集合中的mmap方法(file->f_op->mmap)以注册虚拟内存操作集合。
    例如:假设文件属于EXT4文件系统,文件操作集合中的mmap方法是函数ext4_file_mmap,该函数把虚拟内存区域的成员vm_ops设置为ext4_file_vm_ops。

3-共享匿名映射的虚拟内存区域

共享匿名映射的虚拟内存区域如图所示共享匿名映射的实现原理和文件映射相同,区别是共享匿名映射关联的文件是内核创建的内部文件。

在内存文件系统tmpfs中创建一个名为“/dev/zero”的文件,名字没有意义,创建两个共享匿名映射就会创建两个名为“/dev/zero”的文件,两个文件是独立的,毫无关系。

在这里插入图片描述

  • (1)成员vm_file指向文件的一个打开实例(file)。
  • (2)成员vm_pgoff存放文件的以页为单位的偏移。
  • (3)成员vm_ops指向共享内存的虚拟内存操作集合shmem_vm_ops。

4-私有匿名映射的虚拟内存区域

私有匿名映射的虚拟内存区域如图所示。
在这里插入图片描述

  • ❑ 成员vm_file没有意义,是空指针。

  • ❑ 成员vm_pgoff没有意义。

  • ❑ 成员vm_ops是空指针。

1、页保护位(vm_area_struct.vm_page_prot)

(1)页保护位(vm_area_struct.vm_page_prot):描述虚拟内存区域的访问权限。内核定义了一个保护位映射数组,把VM_READ、VM_WRITE、VM_EXEC和VM_SHARED这4个标志转换成保护位组合。

每种处理器架构需要定义__P000到__S111的宏,P代表私有(Private), S代表共享(Shared),后面的3个数字分别表示可读、可写和可执行,例如__P000表示私有、不可读、不可写和不可执行,__S111表示共享、可读、可写和可执行。

    mm/mmap.c
    pgprot_t protection_map[16] = {
        __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111,
        __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111
    };
    pgprot_t vm_get_page_prot(unsigned long vm_flags)
    {
        return __pgprot(pgprot_val(protection_map[vm_flags &
                    (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) |
                  pgprot_val(arch_vm_get_page_prot(vm_flags)));
    }

函数arch_vm_get_page_prot由每种处理器架构自定义,默认的实现如下:

    include/linux/mman.h
    #ifndef arch_vm_get_page_prot
    #define arch_vm_get_page_prot(vm_flags) __pgprot(0)
    #endif
2、虚拟内存区域标志

(2)虚拟内存区域标志:结构体vm_area_struct的成员vm_flags存放虚拟内存区域的标志,头文件“include/linux/mm.h”定义了各种标志,常用的标志如下。

  • 1)VM_READ、VM_WRITE、VM_EXEC和VM_SHARED分别表示可读、可写、可执行和可以被多个进程共享。

  • 2)VM_MAYREAD表示允许设置VM_READ, VM_MAYWRITE表示允许设置VM_WRITE, VM_MAYEXEC表示允许设置VM_EXEC, VM_MAYSHARE表示允许设置VM_SHARED。这4个标志用来限制系统调用mprotect可以设置的访问权限。

  • 3)VM_GROWSDOWN表示虚拟内存区域可以向下(低的虚拟地址)扩展,VM_GROWSUP表示虚拟内存区域可以向上(高的虚拟地址)扩展。VM_STACK表示虚拟内存区域是栈,绝大多数处理器的栈是向下扩展,VM_STACK等价于VM_GROWSDOWN;少数处理器(例如PA-RISC处理器)的栈是向上扩展,VM_STACK等价于VM_GROWSUP。

  • 4)VM_PFNMAP表示页帧号(Page Frame Number, PFN)映射,特殊映射不希望关联页描述符,直接使用页帧号,可能是因为页描述符不存在,也可能是因为不想使用页描述符。

  • 5)VM_MIXEDMAP表示映射混合使用页帧号和页描述符。

  • 6)VM_LOCKED表示页被锁定在内存中,不允许换出到交换区。

  • 7)VM_SEQ_READ表示进程从头到尾按顺序读一个文件,VM_RAND_READ表示进程随机读一个文件。这两个标志用来提示文件系统,如果进程按顺序读一个文件,文件系统可以预读文件,提高性能。

  • 8)VM_DONTCOPY表示调用fork以创建子进程时不把虚拟内存区域复制给子进程。

  • 9)VM_DONTEXPAND表示不允许使用mremap()扩大虚拟内存区域。

  • 10)VM_ACCOUNT表示虚拟内存区域需要记账,判断所有进程申请的虚拟内存的总和是否超过物理内存容量。

  • 11)VM_NORESERVE表示不需要预留物理内存。

  • 12)VM_HUGETLB表示虚拟内存区域使用标准巨型页。

  • 13)VM_ARCH_1和VM_ARCH_2由各种处理器架构自定义。

  • 14)VM_HUGEPAGE表示虚拟内存区域允许使用透明巨型页,VM_NOHUGEPAGE表示虚拟内存区域不允许使用透明巨型页。

  • 15)VM_MERGEABLE表示KSM(内核相同页合并,Kernel Samepage Merging)可以合并数据相同的页。

3、虚拟内存操作集合

(3)虚拟内存操作集合(vm_operations_struct):定义了虚拟内存区域的各种操作方法,其代码如下。

    include/linux/mm.h
    struct vm_operations_struct {
          void (*open)(struct vm_area_struct * area);
          void (*close)(struct vm_area_struct * area);
          int (*mremap)(struct vm_area_struct * area);
          int (*fault)(struct vm_fault *vmf);
          int (*huge_fault)(struct vm_fault *vmf, enum page_entry_size pe_size);
          void (*map_pages)(struct vm_fault *vmf,
                  pgoff_t start_pgoff, pgoff_t end_pgoff);
         /* 通知以前的只读页即将变成可写,
          * 如果返回一个错误,将会发送信号SIGBUS给进程*/
          int (*page_mkwrite)(struct vm_fault *vmf);
         /* 使用VM_PFNMAP或者VM_MIXEDMAP时调用,功能和page_mkwrite相同*/
          int (*pfn_mkwrite)(struct vm_fault *vmf);
          …
    }
  • 1)open方法:在创建虚拟内存区域时调用open方法,通常不使用,设置为空指针。
  • 2)close方法:在删除虚拟内存区域时调用close方法,通常不使用,设置为空指针。
  • 3)mremap方法:使用系统调用mremap移动虚拟内存区域时调用mremap方法。
  • 4)fault方法:访问文件映射的虚拟页时,如果没有映射到物理页,生成缺页异常,异常处理程序调用fault方法来把文件的数据读到文件的页缓存中。
  • 5)huge_fault方法:和fault方法类似,区别是huge_fault方法针对使用透明巨型页的文件映射。
  • 6)map_pages方法:读文件映射的虚拟页时,如果没有映射到物理页,生成缺页异常,异常处理程序除了读入正在访问的文件页,还会预读后续的文件页,调用map_pages方法在文件的页缓存中分配物理页。
  • 7)page_mkwrite方法:第一次写私有的文件映射时,生成页错误异常,异常处理程序执行写时复制,调用page_mkwrite方法以通知文件系统页即将变成可写,以便文件系统检查是否允许写,或者等待页进入合适的状态。
  • 8)pfn_mkwrite方法:和page_mkwrite方法类似,区别是pfn_mkwrite方法针对页帧号映射和混合映射。

2.链表和树

如图所示,进程的虚拟内存区域按两种方法排序。
在这里插入图片描述

  • (1)双向链表,mm_struct.mmap指向第一个vm_area_struct实例。

  • (2)红黑树,mm_struct.mm_rb指向红黑树的根。

虚拟内存区域使用起始地址和结束地址描述,链表按起始地址递增排序。红黑树是平衡的二叉查找树,按起始地址排序,使用红黑树有以下好处。

  • (1)在红黑树中查找一个虚拟内存区域的速度快。

  • (2)增加一个新的区域时,先在红黑树中找到刚好在新区域前面的区域,然后向链表和树中插入新区域,可以避免扫描链表。

内容来自前辈书籍:《Linux内核深度解析》

Linux系统 mmap 存储映射
tugouxp的专栏
04-23 1786
括号中表示预期行为,括号外部的表示在LINUX系统中的实际行为,比如组合SHARED/EXEC的读行为,对于一个可执行的共享地址来说,没有给与PROT_READ属性,预期当然不可读,但是由于CPU执行上面的代码,必须要进行读操作,而实际的硬件架构和及并没有区分执行读和其它方式的读,所以,实际上对于这样的内存,仍然是可读的。从上图中可以看到,这段匿名区域(可能是MMAP区域,现在的MALLOC都用MMAP实现)地址是向下增长的,像栈一样,就像前面提到的第二种情况,这是在哪里控制的呢?
linux】进程存储映射I/O 匿名映射 匿名映射文件映射的区别
m0_73189710的博客
10-24 773
进程存储映射I/O 匿名映射 匿名映射文件映射的区别
Linux应用---内存映射
m0_56399733的博客
07-03 1191
内存映射也是进程间通信的方式之一,其效率高,可以直接对内存进行操作。本节我们对内存映射进行学习,并结合案例进行实践。
内存映射文件(Memory-Mapped Files)在Java中的应用详解
最新发布
乙壳虫的博客
08-22 1038
内存映射文件是一种将文件的全部或部分内容映射到应用程序的内存地址空间的技术。通过这种映射,程序可以像操作内存一样直接访问文件内容,而不需要显式地调用read或write方法。这种操作方式不仅可以简化代码,还能显著提升文件I/O的性能,特别是在处理大文件或频繁访问文件内容的场景中。在Java中,内存映射文件的实现主要依赖于java.nio包中的类。通过的map方法,可以将文件的内容映射内存中,并通过对文件内容进行读写操作。
ROCT内存申请、注册、映射
11-01 1306
一、总览 1. CPU DDR物理内存对应的虚拟地址全部来自于SVM aperture GPU DDR物理内存对应的虚拟地址根据芯片系列决定来自于gpuvm_aperture或SVM aperture 2. 关于CPU DDR中的userptr区域给GPU访问的原理讨论 1)userptr就是CPU已经申请的CPU DDR空间,现在要register给KFD,再映射给GPU访问 2)register memory API调用过程 (上图的所有DDR处理路径,只有regi...
第49章 内存映射
u010783439的博客
08-13 312
mmap()系统调用在调用进程的虚拟地址空间创建一个新内存映射映射分为两种。文件映射文件映射将一个文件的一部分直接映射到==调用进程的虚拟内存中。==一旦一个文件映射之后就可以通过在相应的区域中操作自己来访问文件内容了。映射的分页会在需要的时候性文件中自动加载。这种映射映射也被称为基于文件映射内存映射文件匿名映射:一个匿名映射没有对应的文件,相反,这种映射的分页会被初始化为0,另一种看待匿名映射 的角度(并且也接近于事实)是把他看成是一个内容总是被初始化为0的虚拟文件映射
Linux内存管理宏观篇(七)虚拟内存
叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。
08-29 1277
前面知道了物理内存,物理内存是实打实的,我只有这么多,用的时候你只能用这么多。为了解决一些问题,产生虚拟内存,通过虚拟内存可以让我们每个进程都能拥有虚拟的3GB用户态地址空间,同时与硬件层屏蔽后还可以增加我们程序的移植性。以及众多好处,这里在前面认识内存的时候讲过,移植性,保护内存安全等等。我觉得最重要的是我们可以通过地址虚拟赋予每个进程更大的内存使用空间,当然这就涉及到不断地映射与释放。而我们的进程基本上不会实实在在的得到3GB的物理内存。咱们常用的malloc()是内存分配的接口。......
一文剖析mlock锁原理
phmatthaus的专栏
02-07 321
一文剖析mlock锁原理
深入理解Linux虚拟内存管理
weixin_45337360的博客
05-05 958
类比快递的收货地址和真实地址位置,首先,收货地址是一个虚拟地址,它是人为定义的,而我们的城市,小区,街道是真实存在的,他们的地理位置就是物理地址。然后,我们切回计算机世界,在计算机里面,内存地址是用来定义数据在内存中存储位置的,内存地址也分为虚拟地址和物理地址。同样,这个虚拟地址也是人为定义的,类比我们现实世界的收货地址,而物理地址就是数据在物理内存中真实存储的位置,类比我们的城市,小区,街道的地理位置。说完定义后,现在开始讲一下虚拟内存地址到底长什么样。
STM32 学习记录:存储器寄存器映射
wangyanan52121的博客
08-25 884
STM32 学习记录:存储器寄存器映射
易语言-创建内存映射文件
06-29
2. **易语言中的内存映射文件API** 易语言提供了如“创建内存映射”、“打开内存映射”、“关闭内存映射”等函数来操作内存映射文件。通过这些函数,开发者可以方便地创建、访问和关闭内存映射文件。 3. **创建...
易语言内存映射类模块
08-17
易语言内存映射类模块是用于在易语言编程环境下实现内存映射文件功能的一个工具,它使得程序可以高效地在进程间共享数据或快速访问大文件内存映射类模块通常包括一系列的操作函数,如创建映射、打开文件、取颗粒数...
内存映射实例
08-06
内存映射(Memory Mapping)是操作系统提供的一种高效访问大文件的技术,它允许程序将文件或者设备的存储区域直接映射到进程的虚拟地址空间中,...通过深入学习和实践,我们可以更好地利用内存映射解决实际的编程挑战。
Python内存映射文件读写方式
09-17
此外,通过本篇文章的学习,我们也了解到了如何创建内存映射文件、进行基本的读写操作以及如何根据不同的需求选择合适的访问模式。这些知识对于优化数据处理流程、提高程序性能都有着重要的意义。
两种内存映射:普通文件匿名文件
sinat_41619762的博客
07-21 1322
普通文件 将可执行文件加载到内存中,进行的映射是普通文件映射。比如.data段、.bss段、.text段等。在cpu第一次访问相关页面的时候,发生缺页中断,才真正将磁盘中的页面缓存到物理内存中。 对于.bss段,不占据实际的磁盘空间,只在段表中记录大小,在符号表中记录符号。当文件加载运行时,才分配空间以及初始化。这就是csapp中提到的如果区域比文件区大,就用零来填充这个区域的余下部分。 匿名文件 堆、栈都是匿名文件映射。虚拟页面并不和磁盘中的文件发生映射。CPU第一次引用一个区域内的匿名页面时,发生缺页
linux内存管理(二)-内存数据结构分析
jianjian的博客
05-27 1888
我们先看下linux源代码里面内存的框架,在task_struct里面有一个mm_struct,他就是我们进程里面的内存结构体,在mm_struct里面有一个vm_area_struct结构体,他是记录进程使用了的虚拟内存。 进程的虚拟地址空间,linux源代码里面有一个 struct mm_struct 结构来管理内存。我们看下这个结构体,这个结果一听在include/linux/mm_types.h文件中,下面会配上个人的一些注释: struct mm_struct { struct { str
计算机底层知识拾遗(九)深入理解内存映射mmap
ITer_ZC的专栏
03-16 8476
内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点。 mmap和虚拟内存管理 先来看看Linux内核的用户进程虚拟内存管理。内核定义了mm_struct结构来表示一个用户进程的虚拟内存地址空间。 1. start_code, end_code指定了进程的代码段的边界,start_data, end_dat
高级OS(八) - Linux内存映射
zxq997997的博客
03-10 439
高级OS(八) - Linux内存映射一.题目二.解答1.进入Linux 内核(4.19)源代码, 给出task_struct 结构,mm_struct 结构和 vm_area_struct 结构的关系图,这样的数据结构设计对你有什么启发?每个数据结构至少分析2个以上字段2.对实验中涉及的相关内核数据结构、函数进行深入分析,并画出流程图。至少分析6个数据结构和6个函数 一.题目 查看学堂在线《Linux内核分析与应用》的4.5~4.7节的视频,完成其实验代码,截图,讨论,两人一组。 进入Linux 内核(
第二讲 内存管理
li_boxue的博客
09-24 1796
本讲讲述内存管理方法。本讲包含三个方面的内容: 首先物理内存内存管理的基础,要解决如何对其有效管理的问题,因此第一部分讲述页框管理。 然后是高端内存管理的三种机制:永久内核映射、临时内核映射和非连续内存区管理。 最后内核如何处理以字节为单位的内存请求?这是第三部分内存区管理的内容。主要讲述slab分配器。
写文章

热门文章

  • HMAC-SHA256 28336
  • PKCS#1、PKCS#5、PKCS#7、PKCS#8到底是什么? 24770
  • Linux文件:/etc/fstab 19832
  • 工具技能学习(一):前置技能-makfile、make、.mk 15888
  • DRM(一):什么是DRM 15535

分类专栏

  • 数字IC 付费 199篇
  • ATF 付费 99篇
  • ARM/Linux嵌入式面试 付费 62篇
  • TEE-OS 付费 76篇
  • C++ 23篇
  • 面试0-1 22篇
  • AIMAKEMONEY 18篇
  • 视野提升 9篇
  • 原型验证 5篇
  • GPU 7篇
  • 0到1的设计之路 2篇
  • 半导体 1篇
  • RISCV 3篇
  • 安全相关 76篇
  • 安全架构 25篇
  • 安全基础 23篇
  • 隐私计算 1篇
  • 媒体 40篇
  • ARM 8篇
  • ARM基础知识 15篇
  • ARM虚拟化 6篇
  • ARM中断 41篇
  • ARM架构 16篇
  • PC 6篇
  • 性能与功耗 4篇
  • Android 4篇
  • Android基础知识 10篇
  • AVB 22篇
  • Go 6篇
  • Linux 4篇
  • Linux电源 7篇
  • Linux驱动 42篇
  • Linux内存 61篇
  • Linux中断 6篇
  • Linux同步 1篇
  • Linux调试 35篇
  • Linux内核初始化 37篇
  • Linux常用指令 2篇
  • C语言扩展-嵌入式C语言 22篇
  • 工具技能知识点学习 78篇
  • 求职 2篇
  • 读书记 18篇
  • 菜鸟日记 20篇

最新评论

  • 什么是PRAM及其工作原理

    月下独码: 文章富含营养,干货满满,实用性强,博主的写作风格简洁明了,让人一目了然。

  • Android AVB的校验宏观的两个阶段

    心火合滨: 可以试试/dev/block/platform/soc/1d84000.ufshc/by-name/mapper下对应的vendor

  • 芯片基识 | 掰开揉碎讲 FIFO(同步FIFO和异步FIFO)

    VCiIC: 应该是

  • 芯片基识 | 掰开揉碎讲 FIFO(同步FIFO和异步FIFO)

    滴iiiiii: 读指针、写指针反了?

  • 嵌入式面试经典30问:二

    土豆片片: 这是一篇高质量的好文,深度理解和清晰的表达方式使复杂的技术概念变得容易理解,值得收藏点赞。

大家在看

  • 帝国CMS – AutoTitlePic 自动生成文章标题图片插件
  • 蜘蛛日志在线分析工具源码 快速分析搜索引擎网络爬虫抓取记录 440
  • 数据结构与算法分析:你真的理解排序算法吗——中值排序(万字长文+代码详解)
  • 帝国CMS7.0 7.2 7.5微信登录插件

最新文章

  • ARM/Linux嵌入式面经(四八):tp-link联洲国际
  • ARM/Linux嵌入式面经(四七):华为
  • ARM/Linux嵌入式面经(四六):华为
2024
10月 30篇
09月 58篇
08月 35篇
07月 78篇
06月 25篇
05月 33篇
04月 32篇
03月 45篇
02月 42篇
01月 21篇
2023年517篇
2022年273篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TrustZone_Hcoco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家动物玻璃钢雕塑销售价格大同小品系列玻璃钢雕塑价格深圳人物玻璃钢雕塑工业花溪区玻璃钢雕塑定做电话海南玻璃钢花盆山东超市商场美陈多少钱山西玻璃钢花盆玻璃钢马雕塑生产厂家邳州新年商场美陈广东透明玻璃钢雕塑生产厂家黄浦区玻璃钢雕塑信息推荐潮州玻璃钢小品雕塑厂玻璃钢雕塑xsjdsc玻璃钢肖像雕塑南昌玻璃钢雕塑定做价格上海商场创意商业美陈怎么做佛山知名玻璃钢雕塑玻璃钢宝剑雕塑永州玻璃钢雕塑品牌哪家好河北玻璃钢仿铜雕塑制作流程玻璃钢娃娃雕塑耒阳玻璃钢牛雕塑水晶玻璃钢花盆哪家好江苏秋季商场美陈销售公司玻璃钢小品雕塑现货石嘴山玻璃钢雕塑加工定制玻璃钢雕塑设计广东小品系列玻璃钢雕塑有没有用玻璃钢做大型雕塑的绵阳玻璃钢卡通雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化