理解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等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

web服务器之——www服务器的基本配置

目录 一、www简介 1、什么是www 2、www所用的协议 3、WEB服务器 4、主要数据 5、浏览器 二、 网址及HTTP简介 1、HTTP协议请求的工作流程 三、www服务器的类型(静态网站(HTML), 动态网站(jsp python,php,perl)) 1、 仅提供…

python:五种算法(GA、OOA、DBO、SSA、PSO)求解23个测试函数(python代码)

一、五种算法简介 1、遗传算法GA 2、鱼鹰优化算法OOA 3、蜣螂优化算法DBO 4、麻雀搜索算法SSA 5、粒子群优化算法PSO 二、5种算法求解23个函数 (1)23个函数简介 参考文献: [1] Yao X, Liu Y, Lin G M. Evolutionary programming made…

QT QIFW Windows下制作安装包(一)

一、概述 1、QIFW是一款基于QT框架开发的跨平台安装框架。QIFW是QT Installer FrameWork的缩写,支持Windows、Linux和macos等多种平台。QIFW可以帮助开发者创建自己的安装程序,将它们打包到通用的安装包中,并提供可视化的界面进行安装。 2…

『App自动化测试之Appium基础篇』| Desired Capabilities详解与使用

App自动化测试之Appium基础篇』| Desired Capabilities详解与使用 1 关于appium driver2 安装appium driver3 安装Appium Python Client4 安装测试对象5 获取测试对象信息5.1 使用dumpsys5.2 使用AndroidKiller5.3 使用aapt 6 Capabilities详解6.1 Capabilities介绍6.2 automat…

19-数据结构-查找-散列查找

目录 一、散列查找结构思路图 二、哈希函数 三、解决冲突 1.开放地址法 1.1.线性探测法(线性探测再散列法) 1.2.平方探测法(二次探测再散列) 1.3.再散列法(双散列法) 2.拉链法 2.1简介 四、散列查…

飞天使-linux操作的一些技巧与知识点3-http的工作原理

文章目录 http工作原理nginx的正向代理和反向代理的区别一个小技巧dig 命令巧用 http工作原理 http1.0 协议 使用的是短连接,建立一次tcp连接,发起一次http的请求,结束,tcp断开 http1.1 协议使用的是长连接,建立一次tc…

【ARM Trace32(劳特巴赫) 使用介绍 13 -- Trace32 断点 Break 命令篇】

文章目录 1. Break.Set1.1 TRACE32 Break1.1.1 Break命令控制CPU的暂停1.2 Break.Set 设置断点1.2.1 Trace32 程序断点1.2.2 读写断点1.2.2.1 变量被改写为特定值触发halt1.2.2.2 设定非值触发halt1.2.2.4 变量被特定函数改写触发halt1.2.3 使用C/C++语法设置断点条件1.2.4 使用…

深入理解 SVG:开启向量图形的大门(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

AutoCAD输入命令突然显示 未知命令。按 F1查看帮助。

CAD一直好的,突然坏了,不能输入命令了,其他功能正常。输入命令显示“未知命令XXX,按 F1 查看帮助。” 网上说的什么病毒,卸载重装等无效。结果发现输入的字符是全角的,不是半角的,就输入法的问…

C++面试宝典第5题:判断素数

题目 判断一个正整数是否为素数有哪几种方法,每种方法的时间复杂度怎么样。 解析 素数又称质数,是指在大于1的自然数中,除了1和它本身以外,不再有其他因数的自然数。素数只有1和它本身两个正因数,最小的素数是2&#x…

【Vue】router.push用法实现路由跳转

目录 router.push用法 在Login.vue中 在Register.vue中 ​ 上一篇:登录与注册界面的制作 https://blog.csdn.net/m0_67930426/article/details/134895214?spm1001.2014.3001.5502 制作了登录与注册界面,并介绍了相关表单元素即属性的用法 在登录页面…

第三十四周:文献阅读+LSTM学习

目录 摘要 Abstract 文献阅读:综合EMD-LSTM模型在城市排水管网水质预测中的应用 现有问题 提出方法 EMD-LSTM综合模型 研究框架 结论 Long Short-term Memory(长短期记忆) 1. LSTM的结构 2. Multiple-layer LSTM 3.3 LSTM Example 3. GRU LSTM实现PM2…

【K8S 系列】认识k8s、k8s架构

一、什么是k8s? Kubernetes 简称 k8s,是支持云原生部署的一个平台,k8s 本质上就是用来简化微服务的开发和部署的,用于自动化部署、扩展和管理容器化应用的开源容器编排技术。对于传统的docker其实也提供了容器编排的技术docker-compose&…

Rust语言GUI库之gtk安装

文章目录 工具链安装管理软件vcpkgvcpkg介绍安装vcpkg 安装gtk遇到的问题Rust其他依赖package-confg 工具链安装管理软件vcpkg vcpkg介绍 在使用C/C编写项目时, 引用第三方库是很麻烦的事, 需要手动下载源码然后编译最后再添加到项目里,配置头文件、lib、dll&…

PyTorch: 基于【MobileNet V2】处理MNIST数据集的图像分类任务【准确率99%+】

目录 引言1. 安装PyTorch2. 下载并加载MNIST数据集3. 搭建基于MobileNet V2的图像分类模型运行结果(重点看网络开头和结束位置即可) 4. 设置超参数、损失函数、优化器5. 训练模型6. 测试模型运行结果 完整代码结束语 引言 在深度学习和计算机视觉的世界…

Windows使用selenium操作浏览器爬虫

以前的大部分程序都是操作Chrome,很少有操作Edge,现在以Edge为例。 Selenium本身是无法直接控制浏览器的,不同的浏览器需要不同的驱动程序,Google Chrome需要安装ChromeDriver、Edge需要安装Microsoft Edge WebDriver&#xff0c…

【PostgreSQL】从零开始:(一)初识PostgreSQL

从零开始:(一)初识PostgreSQL PostgreSQL数据库介绍为什么使用 PostgreSQL?那么多最终用户,云厂商为什么要贡献核心代码?基于PostgreSQL底层开发的好处:为什么要学习PostgreSQL?截止本文发布之日&#xff0…

Web安全之XXE漏洞原理及实践学习

一、原理: XXE漏洞全称即XML外部实体注入漏洞。 攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件),导致可加载恶意外部文件,利用file协议造成文件读取、命令执行、内网端口扫描、攻击内网网站等…

【图论-匈牙利算法】Hungary Algorithm完整代码(一) 之 matlab实现

学习参考链接 博客 分配问题与匈牙利算法 带你入门多目标跟踪(三)匈牙利算法&KM算法 视频 运筹学 | 例题详解指派问题 前言 图论-匈牙利算法原理参见上述参考连接中的博客与BiliBili博主的学习视屏,讲的很好很透彻。强烈建议看完&#…

自定义日志打印功能--C++

一、介绍 日志是计算机程序中用于记录运行时事件和状态的重要工具。通过记录关键信息和错误情况,日志可以帮助程序开发人员和维护人员追踪程序的执行过程,排查问题和改进性能。 在软件开发中,日志通常记录如下类型的信息: 事件信…