逆向映射是干嘛的anon_vma, vma, anon_vma_chain
逆向映射是為了從page得到進程信息,里面有三個比較重要的結(jié)構(gòu)體:
mm_area_struct,
anon_vma_chain,
anon_vma
想象一種復(fù)雜的場景
所以其實一個進程對應(yīng)著很多anon_vma才對
進程A:mmap了16K的匿名頁出來,這16k應(yīng)該是有一個vma,anon_vma結(jié)構(gòu)體,然后四個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中能索引到與之關(guān)聯(lián)的所有的anon_vma_chain,并且通過anon_vma_chain 能夠找到所有的vma】【問題1:】【在anon_vma->rb_root中是通過什么管理的索引呢?】
???????????? 此時B并沒有自己anon_vma,但是當(dāng)次區(qū)域發(fā)生一次缺頁中斷時,這個時候,vma就要重新申請一個vma了,并且把這個區(qū)域之前的anon_vma_chain link到其他的位置上去。詳見do_anonymous_page
? 之前的queue不清除嗎?anon_vma_interval_tree_remove都在哪里調(diào)用呢, 只會在unlink_anon_vmas中查看,而這個anon_vmas是
在中斷上下文不能插入kprobe了嗎?
systemTap在中斷上下文中輸出不了東西!
0x7000 是多大呀? 0b 111 0000 0000 0000
PROT_READ 和 PROT_WRITE 還是不一樣的映射方式;
為啥一個文件以 PROT_READ|PROT_WRITE 和 PROT_WRITE,映射的區(qū)間的大小不是一樣的?!
如果是以只寫映射的,那么值分配分配1M就是1M,但如果是以讀/寫映射的,那么
理一理,現(xiàn)在有下面幾個問題:
1)anon_vma, anon_vma_chain,vma之間的關(guān)系;
2)使用不同的標(biāo)志位去申請PROT_READ|PROT_WRITE,
首先vma和anon_vma之間是一對一的關(guān)系,一個vma中映射了4個page,但是4個page指向一個vma_struct,但是每個page的mapping域指向的都是這個anon_vma,這樣,當(dāng)4個page中的一個page因為各種原因要被unmap掉的時候,此時就先找到anon_vma,,然后從里面找我這個page, unmap會不會達(dá)到部分解映射的效果呢?
munmap(*addr, length)輸入起始地址長度,這總得有一個頁表unmap的過程吧?那么unmap除了去掉頁表項,并且改變vma->anon_vma_chain 到底是個啥意思啊,好像一個頁是放到了anon_vma的紅黑樹中去了,
munmap->do_munmap-->unmap_region-->free_pgtables -->unlink_anon_vmas,在這里會unlink掉對應(yīng)的區(qū)域【突破口哇】
首先解決第一個問題:fork出來了子進程之后,新的進程的anon_vma變成了,發(fā)現(xiàn)16k的mmap區(qū)域,4個頁,只有一個vma, 一個anon_vma_chain....真是暈了
try_to_unmap?? rmap_walk_anon(最重要的釋放匿名頁的函數(shù)啦!)
[ anon_vma_interval_tree_insert ]
在try_to_unmap都沒用到, 幾乎每一次都是伴隨著anon_vma_chain出現(xiàn)的,并且
anon_vma->rb_root是一個區(qū)間樹,在這棵區(qū)間樹中所有包含這個地址的anon_vma_chain
子進程剛開始時確實會進程到父進程vma里面去,如果發(fā)生了一次缺頁中斷咋整呢?
之前anon_vma_chain 鏈接到父進程的anon_vma中去了,那現(xiàn)在呢?
一聽青啤下肚,想明白了:
1)正常情況下,子進程的vma_anon->anon_vma_chain,鏈接到父進程的anon_vma->中去
1)正常情況下,子進程的anon_vma_chain結(jié)構(gòu)體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;當(dāng)一個頁發(fā)生了缺頁中斷時,此時page->mapping指向的是自己進anon_vma中去, 在自己的vma中也有自己的vma_area中,并且會有一個屬于自己的anon_vma_chain,所以一個vma可能是有兩個anon_vma_chain的,其中有一個是鏈接到自己的anon_vma->rb_root中去,所以當(dāng)發(fā)生了缺頁中斷之后,這個page只在自己的anon_vma_chain->vma即可啦。明白了,那么有個問題就是anon_vma_chain中有個list,這個list是干啥的咧, vma->anon_vma_chain中記錄了這個vma_area中所有的節(jié)點,這個節(jié)點在不同的anon_vma中安插了,那么這個list用在哪里呢?【在adjust_vma中】
比如進程A和其子進程B 16k的內(nèi)存映射,剛開始進程B是繼承了所有的A的vma,但是此時如果B把這16k全部都munmap掉,此時進程B在A的vma_anon已經(jīng)沒有價值了,因此可以直接去掉,【在munmap時使用】明白了!這個周末。。。。。。。。。。。。。。。。。開了兩天車,把這個也看明白了,挺好
轉(zhuǎn)載于:https://www.cnblogs.com/honpey/p/7790696.html
總結(jié)
以上是生活随笔為你收集整理的逆向映射是干嘛的anon_vma, vma, anon_vma_chain的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 镜头MTF传递函数解读
- 下一篇: 线程安全之单例模式之懒汉模式