逆向映射是干嘛的anon_vma, vma, anon_vma_chain
逆向映射是为了从page得到进程信息,里面有三个比较重要的结构体:
mm_area_struct,
anon_vma_chain,
anon_vma
想象一种复杂的场景
所以其实一个进程对应着很多anon_vma才对
进程A:mmap了16K的匿名页出来,这16k应该是有一个vma,anon_vma结构体,然后四个anon_vma_chain,四个anon_vma_chain是指向了vma,anon_vma;
进程B:是A的子进程,B进程有属于自己的vma,和四个anon_vma_chain,但是4个anon_vma_chain,是在父进程anon_vma->rb_root管理的【这表明啥咧,这表明一个anon_vma中能索引到与之关联的所有的anon_vma_chain,并且通过anon_vma_chain 能够找到所有的vma】【问题1:】【在anon_vma->rb_root中是通过什么管理的索引呢?】
此时B并没有自己anon_vma,但是当次区域发生一次缺页中断时,这个时候,vma就要重新申请一个vma了,并且把这个区域之前的anon_vma_chain link到其他的位置上去。详见do_anonymous_page
之前的queue不清除吗?anon_vma_interval_tree_remove都在哪里调用呢, 只会在unlink_anon_vmas中查看,而这个anon_vmas是
在中断上下文不能插入kprobe了吗?
systemTap在中断上下文中输出不了东西!
0x7000 是多大呀? 0b 111 0000 0000 0000
PROT_READ 和 PROT_WRITE 还是不一样的映射方式;
为啥一个文件以 PROT_READ|PROT_WRITE 和 PROT_WRITE,映射的区间的大小不是一样的?!
如果是以只写映射的,那么值分配分配1M就是1M,但如果是以读/写映射的,那么
理一理,现在有下面几个问题:
1)anon_vma, anon_vma_chain,vma之间的关系;
2)使用不同的标志位去申请PROT_READ|PROT_WRITE,
首先vma和anon_vma之间是一对一的关系,一个vma中映射了4个page,但是4个page指向一个vma_struct,但是每个page的mapping域指向的都是这个anon_vma,这样,当4个page中的一个page因为各种原因要被unmap掉的时候,此时就先找到anon_vma,,然后从里面找我这个page, unmap会不会达到部分解映射的效果呢?
munmap(*addr, length)输入起始地址长度,这总得有一个页表unmap的过程吧?那么unmap除了去掉页表项,并且改变vma->anon_vma_chain 到底是个啥意思啊,好像一个页是放到了anon_vma的红黑树中去了,
munmap->do_munmap-->unmap_region-->free_pgtables -->unlink_anon_vmas,在这里会unlink掉对应的区域【突破口哇】
首先解决第一个问题:fork出来了子进程之后,新的进程的anon_vma变成了,发现16k的mmap区域,4个页,只有一个vma, 一个anon_vma_chain....真是晕了
try_to_unmap rmap_walk_anon(最重要的释放匿名页的函数啦!)
[ anon_vma_interval_tree_insert ]
在try_to_unmap都没用到, 几乎每一次都是伴随着anon_vma_chain出现的,并且
anon_vma->rb_root是一个区间树,在这棵区间树中所有包含这个地址的anon_vma_chain
子进程刚开始时确实会进程到父进程vma里面去,如果发生了一次缺页中断咋整呢?
之前anon_vma_chain 链接到父进程的anon_vma中去了,那现在呢?
一听青啤下肚,想明白了:
1)正常情况下,子进程的vma_anon->anon_vma_chain,链接到父进程的anon_vma->中去
1)正常情况下,子进程的anon_vma_chain结构体rb_node链接到父进程anon_vma->rb_root中,也就是解析page时(page->anon_vma->rb_root)能找到两个anon_vma_chain(父子进程,由于两者指向的vma不同,所以能so easy地找着两个进程的mm_struct; 虽然子进程的anon_vma_chain->rb_node中,但是anon_vma_chain却链接到了属于自己的vma;当一个页发生了缺页中断时,此时page->mapping指向的是自己进anon_vma中去, 在自己的vma中也有自己的vma_area中,并且会有一个属于自己的anon_vma_chain,所以一个vma可能是有两个anon_vma_chain的,其中有一个是链接到自己的anon_vma->rb_root中去,所以当发生了缺页中断之后,这个page只在自己的anon_vma_chain->vma即可啦。明白了,那么有个问题就是anon_vma_chain中有个list,这个list是干啥的咧, vma->anon_vma_chain中记录了这个vma_area中所有的节点,这个节点在不同的anon_vma中安插了,那么这个list用在哪里呢?【在adjust_vma中】
比如进程A和其子进程B 16k的内存映射,刚开始进程B是继承了所有的A的vma,但是此时如果B把这16k全部都munmap掉,此时进程B在A的vma_anon已经没有价值了,因此可以直接去掉,【在munmap时使用】明白了!这个周末。。。。。。。。。。。。。。。。。开了两天车,把这个也看明白了,挺好
转载于:https://www.cnblogs.com/honpey/p/7790696.html
逆向映射是干嘛的anon_vma, vma, anon_vma_chain相关推荐
- Linux内存逆向映射(reverse mapping)技术的前世今生
本文来自于微信公众号Linux阅码场 一.前言 数学大师陈省身有一句话是这样说的:了解历史的变化是了解这门学科的一个步骤.今天,我把这句话应用到一个具体的Linux模块:了解逆向映射的最好的方法是了解 ...
- 鱼眼校正c语言算法,一种鱼眼图像逆向经纬映射的快速校正算法
1. 引言 鱼眼镜头因其焦距短,视场大,拍摄图像信息量大等优点,在安防监控.360度汽车成像仪等领域中得到广泛应用.但鱼眼镜头在获得大视场的同时,会产生严重的图像畸变问题 [1] [2] .通过鱼眼镜 ...
- Vulkan系列教程—VMA教程(三)—内存映射(Memory Mapping)
文章目录 前言 一.Mapping Functions 二.Persistently mapped memory(永久Mapping) 三.Cache flush and invalidate 四.检 ...
- [内核内存] 反向映射详解
文章目录 1 匿名页反向映射 1.1 匿名页反向映射关键数据结构 1.2 linux匿名页的反向映射机制 1.3 进程创建时反向映射相关结构体间的关系 1.4 linux为匿名页的VMA分配AV的流程 ...
- linux内存的反向映射
内存的反向映射 前言 文件页的反向映射 匿名页的反向映射 当VMA和VA首次相遇 在fork的时候,匿名映射的VMA经历了什么 构建三层大厦 page frame是如何加入"大厦" ...
- 《Linux Device Drivers》第十五章 内存映射和DMA——note
简单介绍 很多类型的驱动程序编程都须要了解一些虚拟内存子系统怎样工作的知识 当遇到更为复杂.性能要求更为苛刻的子系统时,本章所讨论的内容迟早都要用到 本章的内容分成三个部分 讲述mmap系统调用的实现 ...
- linux内核那些事之VMA常用操作
内核对vm_area_struct 数据结构相关操作进行了一系列封装,方面进行后续操作,vma的操作实现大部分位于mm\mmap.c文件中 find_vma() find_vma()是内核中经常需要查 ...
- Linux内存管理:反向映射机制(匿名页,文件页和ksm页)
目录 1.反向映射的发展 2.反向映射应用场景 3.匿名页的反向映射 4.文件页的反向映射 5.ksm页的反向映射 6.总结 7.作者简介 8.推荐阅读 为了系统的安全性,Linux内核将各个用户进程 ...
- linux内存管理笔记(三十四)----匿名映射
匿名内存是用户空间的概念,不涉及内核态内存.匿名内存的概念是指一段虚拟内存映射是否与之相关联的对象,如果没有关联对象就称为匿名的.本章就主要学习缺页异常的匿名映射,其中涉及到以下内容 匿名映射的概念 ...
最新文章
- Java项目:网上花店商城系统(java+jsp+servlert+mysql+ajax)
- cnblog如何配置live writer
- shell对于字符串的操作
- [转]Spring事务tx:annotation-driven/
- python 进行后端分页详细代码
- 傻瓜式Git提交代码流程【写给初学者】
- Kindle 3---原系统下的字典的使用
- 测试用例设计方法——正交实验法
- 【数理逻辑三】命题逻辑及形式系统【上】
- MFC之菜单栏的相关使用14
- bt5 note [7] 无线破解
- java拼图游戏(带文档资料)
- 关于网易云验证码的服务介绍
- 任意多边形面积计算公式
- 极速办公(excel)如何使用SUM函数求和
- eclipse 打开pom.xml文件很慢 设置pom.xml打开方式
- 计算机网络云怎么连接网络设置方法,华为云电脑如何连网,华为云电脑使用教程...
- 急如闪电快如风,彩虹女神跃长空,Go语言高性能Web框架Iris项目实战-初始化项目ep00
- UEFI 基础教程 (十一) - Shell下读取SMBIOS信息
- 【连载】物联网全栈教程-从云端到设备(十二)---最简单的单片机上云方法!...
热门文章
- python技巧(2)--碾平列表和列表去重
- 说说mysql_说说MySQL权限 - andyqian的个人空间 - OSCHINA - 中文开源技术交流社区
- 基于DispatchProxy打造自定义AOP组件
- 人事面试的那些问题及背后的考察点
- React中添加注释
- Docker: Jenkins里的pipeline编写基本技巧
- elasticsearch 问题
- 运用Zabbix实现内网服务器状态及局域网状况监控(2) —— 环境配置
- 安装kali linux 2017.1 【二、安装VMware-tools 以及相关问题处理】
- C#基础系列 - 抽象类及其方法的学习