日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

逆向映射是干嘛的anon_vma, vma, anon_vma_chain

發(fā)布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 逆向映射是干嘛的anon_vma, vma, anon_vma_chain 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

逆向映射是為了從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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。