理解linux中反向映射与应用

反向映射的作用是根据物理页,找到全部相关进程的vma。

主要有两个结构,anon_vma_chain链表,和 anon_vma->rb_root红黑树

打个不恰当的比喻:可以简单认为,红黑树是用来读的(遍历找全部映射的vm_area),链表是用来写的(修改红黑树中节点的依据)

缺页异常

当通过mmap创建一个匿名的vm_area后(get_unmapped_area+mmap_region),访问这个area中的页触发缺页异常处理(do_anonymous_page->anon_vma_prepare)进程时为vm_area创建一个anon_vma,并生成一个绑定anon_vma和vm_area的anon_vma_chain节点,放在vma_area->anon_vma_chain链表上和anon_area->rb_root红黑树上(anon_vma_chain_link)。

红黑树中存的是所有映射同一anon_vma的anon_vma_chain节点,链表存的是所有映射相同一vm_area的anon_vma_chain节点。

Fork

fork子进程时(fork->kernel_clone->copy_process->copy_mm->dup_mm->dup_mmap->anon_vma_fork),会调anon_vma_clone通过遍历anon_vma_chain来拷贝所有映射同一vm_area节点的anon_vma_chain到子进程的vm_area->anon_vma_chain上,然后分配一个自己的anon_vma节点(anon_vma_fork,这里如果父anon_vma节点已经没人引用了,也可以复用过来,不用自己创建),anon_vma->root指向最初的anon_vma,anon_vma->parent指向父进程的anon_vma。同时将绑定这个新anon_vma和自己vm_area的anon_vma_chain节点放在子进程的vm_area->anon_vma_chain上。

子进程的这个anon_vma_chain节点要加在父进程的anon_area->rb_root红黑树上,因为它映射anon_area与父进程的anon_area相同,如果要unmap父进程的anon_area中的物理页,需要通过红黑树找到子节点,并对子节点做unmap。同理,如果后面再fork孙进程的话,它引用的anon_area页可能是父进程anon_area原本的页,也可能是子进程后面通过copy on write创建的新anon_area页,但如果子进程vm_area发生过变化,则一定只出现在子红黑树上。所以既可能同时出现在子与父进程的红黑树上,又可能只出现在子红黑树上(取决于子进程的vm_area有没有发生过变化)。

子进程的这个anon_vma_chain节点还要加在子进程的anon_area->anon_vma_chain上,因为现在的vm_area与原来的vm_area还是一样的,当要改子进程的vm_area时,需要通过anon_vma_chain找到所有映射过这个vm_area的父vm_area节点,将自己的anon_vma_chain从父anon_area的红黑树中移除。同理,如果后面再fork孙进程的话,它引用的vm_area既可能与父子均相同,又可能只与子相同,但只需要拷贝子进程的anon_vma_chain上节点即可,因为子进程的anon_vma_chain上包含了父进程的anon_vma_chain(如果父子进程的vm_area内容一样的话)。

Copy on write

当子进程访问写保护页触发unshare类型的缺页异常时,处理函数中会重新分配物理页(handle_pte_fault->do_wp_page->wp_page_copy),并将物理页的mapping指向子进程的anon_area(folio_add_new_anon_rmap),并将vm_area对应的pte换掉。但不会改父进程的红黑树,虽然父进程的anon_area上的页不再与子进程的anon_area页相同了(为什么不改父进程的anon_vma_chain和红黑树呢?原因不清楚,但没有关系,在遍历父进程红黑树时(rmap_walk)会跳过这个已经COW的vm_area,因为它们的物理页范围没有交集(check_pte(pvmw)))。

应用

遍历anon_vma_chain

当改变vm_area时,需要找到所有引用这个vm_area的父vm_area和anon_area,将anon_vma_chain从它们的链表与红黑树中删除,后面fork的子进程将不再继承子进程之上的vm_area和anon_area。比如move_vma、copy_vma、free_pgtables、anon_vma_merge、vma_merge、vma_shrink、vma_expand、do_brk、split_vma。

遍历anon_area的红黑树

当需要修改anon_area对应的页表项(改物理地址,或改flag)时,需要找到所有anon_area引用过的子进程的vma,同时做同一件事。比如页迁移修改 pte,页回收清除pte,标记页为 accessed / young,查看一个页框folio_referenced等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/218728.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战演示 H5 性能分析

W3C标准是浏览器标准,一般浏览器都支持W3C标准,它规定使用者可以通过api查询性能信息,可借用W3C协议完成自动化H5性能测试。 W3C官网:www.w3.org/TR/navigati… 使用chrome浏览器对webview进行手工查看,伴随着业务增多…

Oracle EBS PAC“定期成本分配处理程序”报错:30004不存在为成本类型、成本组和法人主体定义的帐户

Oracle EBS版本: RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: 中文环境: 30004不存在为成本类型、成本组和法人主体定义的帐户。 CSTPALPC.dyn_proc_call : Error Calling Package 30004不存在为成本类型、成本组和法人主…

Enterprise Portal Standard Edition [WS_ENT_STD]

拾取坐标系统 i18n internationalization-CSDN博客 另外一种网站 Content Management System(CMS)-CSDN博客

智能优化算法应用:基于象群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于象群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于象群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.象群算法4.实验参数设定5.算法结果6.参考文献7.MA…

【Spring Boot】快速入门

一、引言 1、什么是spring boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff…

Qt 文字描边(基础篇)

项目中有时需要文字描边的功能 1.基础的绘制文字 使用drawtext处理 void MainWindow::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);painter.setRenderHint(QPainter::SmoothPixmapTransform, true);painte…

lwIP 细节之六:connected、sent、poll 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程,其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数,注册到协议栈,在适当的时候,由协议栈自动调用,所以称为回调。 注:除非特别说明,以下内…

RTMP流设置超时时间失败

使用FFmpeg(版本是5.0.3)将rtmp流作为输入,设置超时时间(使用-timeout参数),结果报错:Cannot open Connection tcp://XXX:1935?listen&listen_timeout 通过./ffmpeg -help full 命令查看FFmpeg帮助&am…

Flutter工具安装与环境搭建

1、下载 Flutter SDK,下载完成后,在需要放置SDK的地方解压即可。 注意: 请勿将 Flutter 有特殊字符或空格的路径下。请勿将 Flutter 安装在需要高权限的文件夹内,例如 C:\Program Files\。 2、配置环境变量 例如: …

YOLOv8改进 | 2023主干篇 | 替换LSKNet遥感目标检测主干 (附代码+修改教程+结构讲解)

一、本文介绍 本文给大家带来的改进内容是LSKNet(Large Kernel Selection, LK Selection),其是一种专为遥感目标检测设计的网络架构,其核心思想是动态调整其大的空间感受野,以更好地捕捉遥感场景中不同对象的范围上下…

[Linux] Apache的配置与运用

一、web虚拟主机的构台服务器上运行多个网站,每个网站实际上并不独立占用整个服务器,因此称为"虚拟"虚拟主机的虚拟主机服务可以让您充分利用服务器的硬件资源,大大降低了建立和运营网站的成本 Httpd服务使构建虚拟主机服务器变得容…

Axure元件基本介绍进阶

Axure元件基本介绍进阶 1.Axure元件基本介绍1.在 Axure 中,元件是构建原型的基本构成单元,能够帮助设计师快速创建、重复使用和管理设计元素。以下是 Axure 中元件的基本介绍:1.基本元件: 2.基本元件的使用一.【举例说明】积木&am…

如何禁止服务器自动休眠

如何禁止服务器自动休眠 有时候服务器自己休眠,导致系统web站点无法访问,下面是解决办法! 禁止服务器自动进入休眠状态的具体方法可能会因使用的Linux发行版而有所不同。以下是一些通用的方法,你可以根据你的系统选择适用的&#…

DS考研真题总结——客观题(1)

开始整理真题中的客观小题,至于和算法有关的大题统一最后整理~ 定义背诵:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效…

深度学习基本概念

1.全连接层 全连接层就是该层的所有节点与输入节点全部相连,如图所 示。假设输入节点为X1, X 2, X 3,输出节点为 Y 1, Y 2, Y 3, Y 4。令 矩阵 W 代表全连接层的权重, W 12也就代表 …

初级数据结构(五)——树和二叉树的概念

文中代码源文件已上传&#xff1a;数据结构源码 <-上一篇 初级数据结构&#xff08;四&#xff09;——队列 | NULL 下一篇-> 1、树结构&#xff08;Tree&#xff09; 1.1、树结构的特点 自然界中的树由根部开始向上生长&#xff0c;随机长出分支&…

ArcGIS Pro SDK文件选择对话框

文件保存对话框 // 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;//设置文件的保存路径SaveItemDialog saveLayerFileDialog new SaveItemDialog(){Title "Save Layer File",OverwritePrompt true,//获取或设置当同名文件已存在时是否出现…

鸿蒙开发编辑器设置

首先需要知道如何打开设置页面&#xff0c;以下所有设置都需要在设置界面中进行修改&#xff0c;有三种方式可以打开&#xff0c; 1、编辑器左上角file菜单下的Setting菜单。 2、编辑器右上角的设置按钮 3、按快捷键 ctrlalts 注意不要和其他软件案件重复。 一、设置每次打开…

Netty常见的设计模式

简介 设计模式在软件开发中起着至关重要的作用&#xff0c;它们是解决常见问题的经过验证的解决方案。而Netty作为一个优秀的网络应用程序框架&#xff0c;同样也采用了许多设计模式来提供高性能和可扩展性。在本文中&#xff0c;我们将探讨Netty中使用的一些关键设计模式&…