溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux內(nèi)核反向映射機制是什么

發(fā)布時間:2021-11-23 15:44:25 來源:億速云 閱讀:125 作者:iii 欄目:系統(tǒng)運維

本篇內(nèi)容主要講解“Linux內(nèi)核反向映射機制是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Linux內(nèi)核反向映射機制是什么”吧!

1.反向映射的發(fā)展

實際上在早期的Linux內(nèi)核版本中是沒有反向映射的這個概念的,那個時候為了找到一個物理頁面對應的頁表項就需要遍歷系統(tǒng)中所有的mm組成的鏈表,然后對于每一個mm再遍歷每一個vma,然后查看這個vma是否映射了這頁,這個過程極其漫長而低效,有的時候不得不遍歷完所有的mm然后才能找映射到這個頁的所有pte。

Linux內(nèi)核反向映射機制是什么

后來人們發(fā)現(xiàn)了這個問題,就再描述物理頁面的page結(jié)構(gòu)體中增加一個指針的方式來解決,通過這個指針來找到一個描述映射這個頁的所有pte的數(shù)組結(jié)構(gòu),這對于反向映射查找所有pte易如反掌,但是帶來的是浪費內(nèi)存的問題。

Linux內(nèi)核反向映射機制是什么

接著就在2.6內(nèi)核的時候,內(nèi)核大神們想到了復用page結(jié)構(gòu)中的mapping字段,然后通過紅黑樹的方式來組織所有映射這個頁的vma,形成了匿名頁和文件頁的反向映射機制。

如下為匿名頁反向映射圖解:

Linux內(nèi)核反向映射機制是什么

如下為文件頁反向映射圖解:

Linux內(nèi)核反向映射機制是什么

但是后來匿名頁的反向映射遇到了效率和鎖競爭激烈問題,就促使了目前使用的通過avc的方式聯(lián)系各層級反向映射結(jié)構(gòu)然后將鎖的粒度降低的這種方式??梢钥吹椒聪蛴成涞陌l(fā)展是伴隨著Linux內(nèi)核的發(fā)展而發(fā)展,是一個不斷進行優(yōu)化演進的過程。

2.反向映射應用場景

那么為何在Linux內(nèi)核中需要反向映射這種機制呢?它究竟為了解決什么樣的問題而產(chǎn)生的呢?

試想有如下場景:

(1)一個物理頁面被多個進程的vma所映射,系統(tǒng)過程中發(fā)生了內(nèi)存不足,需要回收一些頁面,正好發(fā)現(xiàn)這個頁面是適合我們回收利用的,我們能夠直接把這個頁面還給伙伴系統(tǒng)嗎?答案肯定是不能。因為這個頁面被很多個進程所共享,我們必須做的事情就是斷開這個頁面的所以映射關系,這就是反向映射所做的事情。

(2)一些情況我們需要將一個頁面遷移到另一個頁面,但是牽一發(fā)而動全身,可能有一些進程已經(jīng)映射這個即將要遷移的頁面到自己的vma中,那么這個時候同樣需要我們知道究竟這個頁面被哪些vma所映射呢?這同樣是反向映射所做的事情。

實際上,反向映射的主要應用場景為內(nèi)存回收和頁面遷移,當系統(tǒng)發(fā)生內(nèi)存回收和頁面遷移的時候,對于每一個候選頁Linux內(nèi)核都會判斷是否為映射頁,如果是,就會調(diào)用try_to_unmap  來解除頁表映射關系,本文也主要來從try_to_unmap函數(shù)來解讀反向映射機制。

如果我們在細致到其他的內(nèi)核子系統(tǒng)會發(fā)現(xiàn),在內(nèi)存回收,內(nèi)存碎片整理,CMA,  巨型頁,頁遷移等各個場景中都能發(fā)現(xiàn)反向映射所做的關鍵性的工作,所有理解反向映射機制在Linux內(nèi)核中的實現(xiàn)是理解掌握這些子系統(tǒng)的基礎和關鍵性所在,否則你即將不能理解這些技術(shù)背后的脊髓所在,所以說理解反向映射這種機制對于理解Linux內(nèi)核內(nèi)存管理是至關重要的!!!

3.匿名頁的反向映射

匿名頁的共享主要發(fā)生在父進程fork子進程的時候,父fork子進程時,會復制所有vma給子進程,并通過調(diào)用dup_mmap->anon_vma_fork建立子進程的rmap以及和長輩進程rmap關系結(jié)構(gòu):

Linux內(nèi)核反向映射機制是什么

主要通過anon_vma這個數(shù)據(jù)結(jié)構(gòu)體中的紅黑樹將共享父進程的頁的所有子進程的vma聯(lián)系起來(通過anon_vma_chain  來聯(lián)系對應的vma和av),當然這個關系建立比較復雜,涉及到vma,avc和av這些數(shù)據(jù)結(jié)構(gòu)體。.

而在缺頁異常do_anonymous_page的時候?qū)age和vma相關聯(lián)。

當內(nèi)存回收或頁面遷移的時候,內(nèi)核路徑最終會調(diào)用到:

try_to_unmap //mm/rmap.c ->rmap_walk   ->rmap_walk_anon      ->anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root,pgoff_start, pgoff_end)          ->rwc->rmap_one             ->try_to_unmap_one

對于候選頁,會拿到候選頁相關聯(lián)的anon_vma,然后從anon_vma的紅黑樹中遍歷到所有共享這個頁的vma,然后對于每一個vma通過try_to_unmap_one來處理相對應的頁表項,將映射關系解除。

4.文件頁的反向映射

文件頁的共享主要發(fā)生在多個進程共享libc庫,同一個庫文件可以只需要讀取到page  cache一次,然后通過各個進程的頁表映射到各個進程的vma中。

管理共享文件頁的所以vma是通過address_space的區(qū)間樹來管理,在mmap或者fork的時候?qū)ma加入到這顆區(qū)間樹中:

Linux內(nèi)核反向映射機制是什么

發(fā)生文件映射缺頁異常的時候,將page和address_space相關聯(lián)。

當內(nèi)存回收或頁面遷移的時候,內(nèi)核路徑最終會調(diào)用到:

try_to_unmap //mm/rmap.c ->rmap_walk   ->rmap_walk_file     ->vma_interval_tree_foreach(vma, &mapping>i_mmap,pgoff_start, pgoff_end)           ->rwc->rmap_one

對于每一個候選的文件頁,如果是映射頁,就會遍歷page所對應的address_space的區(qū)間樹,對于每一個滿足條件的vma,調(diào)用try_to_unmap_one來找到pte并解除映射關系。

5.ksm頁的反向映射

ksm機制是內(nèi)核將頁面內(nèi)容完全相同的頁面進行合并(ksm管理的都是匿名頁),將映射到這個頁面的頁表項標記為只讀,然后釋放掉原來的頁表,來達到節(jié)省大量內(nèi)存的目的,這對于host中開多個虛擬機的應用場景非常有用。

ksm機制中會管理兩課紅黑樹,一棵是stable tree,一棵是unstable tree,stable  tree中的每個節(jié)點stable_node中管理的頁面都是頁面內(nèi)容完全相同的頁面(被叫做kpage),共享kpage的頁面的頁表項都會標記為只讀,而且對于原來的候選頁都會有rmap_item來描述他的反向映射(其中的anon_vma成員的紅黑樹是描述映射這個候選頁的所有vma的集合),合并的時候會加入到對應的stable  tree節(jié)點和鏈表中。

當內(nèi)存回收或頁面遷移的時候,內(nèi)核路徑最終會調(diào)用到:

try_to_unmap //mm/rmap.c ->rmap_walk    ->rmap_walk_ksm  //mm/ksm.c         -> hlist_for_each_entry(rmap_item, &stable_node->hlist, hlist)     ->anon_vma_interval_tree_foreach(vmac, &anon_vma->rb_root,0, ULONG_MAX)        ->rwc->rmap_one

對于一個ksm頁面,反向映射的時候,會拿到ksm頁面對應的節(jié)點,然后遍歷節(jié)點的hlist鏈表,拿到每一個anon_vma,然后就和上面介紹的匿名頁的反向映射一樣了,從anon_vma的紅黑樹中找到所有的vma,最后try_to_unmap_one來找到pte并解除映射關系。

到此,相信大家對“Linux內(nèi)核反向映射機制是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI