逆向映射是干嘛的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

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

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

相关文章

1359C. Mixing Water

C. Mixing Water 一个简单的思维。 因为是一隔一的,所以要么热水多放一个,要么冷水和热水一样多。 设热水与要求的差为cou1,冷水与要求的差为cou2。 所以我们先考虑两种情况: 1,cou1大于cou2,那么肯定是要…

读取txt文件赋值到DataGridView中

先查看txt是每条信息之间是通过什么分割,我是通过换行符(\n)分割的, 然后再看每一条信息中字段是通过什么分割,我的字段是通过 tab键(\t)分割。 第一步 先获取到txt文件的路径: //获取绝对路径v…

Combobox报错:row[opts.textField].toLowerCase is not a function。

使用easyui框架加载combobox。 html页面&#xff1a; <span class"search_item"><span class"item_text">账号ID:</span><span class"item_obj"><input class"easyui-textbox" type"text" name&…

c++ 线程什么时候run_多线程并发支撑基础之JAVA内存模型

Java内存模型可以说是Java并发的底层支持&#xff0c;了解Java内存模型才能正在了解Java并发。内存模型在内存中设置一个变量"value 1&#xff1b;"那么其他线程能在什么时候读取到这个结果呢&#xff1f;有可能不能立即甚至永远都读不到。比如指令顺序与源代码中的…

1476D. Journey

D. Journey 一道简单线性dp#include <bits/stdc.h> using namespace std; const int N 5e5 3; char str[N]; int a[N],b[N]; int main() {int t;cin>>t;while (t--){int n;cin>>n;cin>>str1;for (int i0;i<n;i) a[i] b[i] 1;if (str[1]L) a[1]…

润乾报表 数据集ds1中,数据源xmglxt_x3无数据库连接,且未设定数据连接工厂,请检查数据源设定:...

一、润乾报表错误内容 产生数据工厂: com.runqian.report4.dataset.SQLDataSetFactory 失败 错误来源&#xff1a;: 数据集ds1中&#xff0c;数据源xmglxt_x3无数据库连接&#xff0c;且未设定数据连接工厂&#xff0c;请检查数据源设定&#xff1a; 二、解决方法 同事做的润乾…

1388C. Uncle Bogdan and Country Happiness

C. Uncle Bogdan and Country Happiness 纯纯DFS#include <bits/stdc.h> using namespace std; const int N 1e5 3; #define int long long int a[N], b[N], c[N]; vector<int> cun[N]; int vis[N]; int ff 1; void DFS(int x) {int res 0;int xx a[x];for (…

WPF中的数据绑定Data Binding使用小结

完整的数据绑定的语法说明可以在这里查看&#xff1a; http://www.nbdtech.com/Free/WpfBinding.pdf MSDN资料&#xff1a; Data Binding: Part 1 http://msdn.microsoft.com/en-us/library/aa480224.aspx Data Binding: Part 2 http://msdn.microsoft.com/en-us/library/aa480…

awr报告分析 mysql_AWR报告的生成和简单分析方法

生成AWR报告方法&#xff1a; 第一步&#xff1a;数据库压力测试卡开始时&#xff1a;生成第一个快照&#xff1a; Sqlexec dbms_workload_repository.create_snapshot(); 第二步&#xff1a;数据库压力测试结束时&#xff1a;生成第二个快照 Sqlexec dbms_workload_repository…

1560F1. Nearest Beautiful Number (easy version)

F1. Nearest Beautiful Number (easy version) 预处理加二分#include <bits/stdc.h> using namespace std; const int N 3e5 3; #define int long long set<int>cun1,cun2; signed main() {//单个for (int i1;i<9;i){int res 0;for (int j0;j<9;j) {res …

sqlserver 微信昵称_sql server用户名和登录名的区别和联系

在SQLSERVER数据库中&#xff0c;guest帐户是特殊的用户帐户。如果用户使用USE database语句访问的数据库中没有与此用户关联的帐户&#xff0c;此用户就与guest用户相关联。另外SQLSERVER采取登录名-用户名的安全规则&#xff0c;和Oracle里面的schema有点像。SQLSERVER使用所…

1506G. Maximize the Remaining String

G. Maximize the Remaining String 贪心&#xff0c;放置时&#xff0c;如果前面一个小比他小&#xff0c;并且后面还有&#xff0c;那么就把前面的删除#include <bits/stdc.h> using namespace std; const int N 3e5 3; #define int long long string str; char ans[…

bzoj 1208

1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 9775 Solved: 3918[Submit][Status][Discuss]Description 最近&#xff0c;阿Q开了一间宠物收养所。收养所提供两种服务&#xff1a;收养被主人遗弃的宠物和让新的主人领养这些宠物。每个领养者都…

.net千万级数据导出_记一次解决docker下oracle数据库故障事例

一、问题背景&#xff1a;某个项目的线上环境oracle数据库挂了&#xff0c;同事急匆匆来找我救火。我简单咨询了一些基本情况&#xff1a;线上环境&#xff0c;docker部署&#xff0c;已正常运行半年。由于宿主机的根目录硬盘空间不够&#xff0c;运维的同事想把oracle数据文件…

1644E. Expand the Path

E. Expand the Path 一道灯下黑的题目。 我们很显然知道&#xff0c;要让每个列的上限最小&#xff0c;下限最大&#xff08;同理计算行也可以&#xff09;。 所以图形应该是一个中心对称图形 所以空白部分是一个矩形&#xff08;除了一开始的地方&#xff09;&#xff0c;但是…

Swift 将日期转化为字符串,显示上午还是下午

let dateF DateFormatter() // aaa 用于显示上午还是下午&#xff0c;mm和MM 分别表示12小时制和24小时制 dateF.dateFormat "yyyy-MM-dd aaa hh:mm:ss" dateF.amSymbol "上午" dateF.pmSymbol "下午" let str dateF.string(from: Date()) …

车间生产能耗管控方案_如何给生产车间降温 环保空调的这些方案一定能帮到你...

生产车间闷热如何降温&#xff1f;高温闷热带来的影响是非常大&#xff0c;在厂房车间闷热的环境会影响作业人员的情绪&#xff0c;增加燥热感&#xff0c;使工作效率下降&#xff0c;生产力降低&#xff0c;产品质量变差&#xff0c;蕞严重的结果导致客户流失&#xff0c;所以…

1612D. X-Magic Pair

D. X-Magic Pair 一道数学题&#xff0c;我们让a>b&#xff0c;那么如果x在a到a%b之间就可以通过a-n*b得到 然后辗转相余#include <bits/stdc.h> using namespace std; #define int long long const int mod 998244353; const int N 2e5 9; map<int, int> m…

【BZOJ2791】[Poi2012]Rendezvous 倍增

【BZOJ2791】[Poi2012]Rendezvous Description 给定一个n个顶点的有向图&#xff0c;每个顶点有且仅有一条出边。对于顶点i&#xff0c;记它的出边为(i, a[i])。再给出q组询问&#xff0c;每组询问由两个顶点a、b组成&#xff0c;要求输出满足下面条件的x、y&#xff1a;1. 从顶…

app开发人脸登录和指纹登录_易讯云通讯推出“一键登录”,为App登录提供新方案...

移动互联网时代&#xff0c;用户的耐心越来越少&#xff0c;注意力也越来越弱&#xff0c;追求便捷与高效。登录的方式从自定义的账号密码登录&#xff0c;到邮箱登录&#xff0c;到第三方登录与手机验证码登录两种登录方式进行竞争&#xff0c;到现在的个人指纹&#xff0c;人…