衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux內核反向映射基礎知識詳解

Linux閱碼場 ? 來源:Linuxer ? 作者:Linuxer ? 2020-11-26 14:42 ? 次閱讀

作者簡介

Cheetah,曾為U-boot社區和Linux內核社區提交過若干補丁,主要從事Linux相關系統軟件開發工作,負責Soc芯片BringUp及系統軟件開發,喜歡閱讀內核源代碼,在不斷的學習和工作中深入理解內存管理,進程調度,文件系統,設備驅動等內核子系統。

為了系統的安全性,Linux內核將各個用戶進程運行在各自獨立的虛擬地址空間,用戶進程之間通過虛擬地址空間相互隔離,不能相互訪問,一個進程的奔潰不會影響到整個系統的異常也不會干擾到系統以及其他進程運行。

Linux內核可以通過共享內存的方式為系統節省大量內存,例如fork子進程的時候,父子進程通過只讀的方式共享所有的私有頁面。再比如通過IPC共享內存方式,各個不相干的進程直接可以共享一塊物理內存等等。

我們都知道操作系統開啟mmu之后cpu訪問到的都是虛擬地址,當cpu訪問一個虛擬地址的時候需要通過mmu將虛擬地址轉化為物理地址,這叫做正向映射。而與本文相關的是反向映射,它主要是通過物理頁來找到共享這個頁的所有的vma對應的頁表項,這是本文討論的問題。

本文目錄:
1.反向映射的發展
2.反向映射應用場景
3.匿名頁的反向映射
4.文件頁的反向映射
5.ksm頁的反向映射
5.總結

注:反向映射機制是Linux內核虛擬內存管理的難點也是理解內存管理的關鍵技術之一?。?/p>

1.反向映射的發展

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

后來人們發現了這個問題,就再描述物理頁面的page結構體中增加一個指針的方式來解決,通過這個指針來找到一個描述映射這個頁的所有pte的數組結構,這對于反向映射查找所有pte易如反掌,但是帶來的是浪費內存的問題。

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

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

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

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

2.反向映射應用場景

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

試想有如下場景:
(1)一個物理頁面被多個進程的vma所映射,系統過程中發生了內存不足,需要回收一些頁面,正好發現這個頁面是適合我們回收利用的,我們能夠直接把這個頁面還給伙伴系統嗎?答案肯定是不能。因為這個頁面被很多個進程所共享,我們必須做的事情就是斷開這個頁面的所以映射關系,這就是反向映射所做的事情。
(2)一些情況我們需要將一個頁面遷移到另一個頁面,但是牽一發而動全身,可能有一些進程已經映射這個即將要遷移的頁面到自己的vma中,那么這個時候同樣需要我們知道究竟這個頁面被哪些vma所映射呢?這同樣是反向映射所做的事情。

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

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

3.匿名頁的反向映射

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


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

而在缺頁異常do_anonymous_page的時候將page和vma相關聯。

當內存回收或頁面遷移的時候,內核路徑最終會調用到:

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

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

4.文件頁的反向映射

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

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


發生文件映射缺頁異常的時候,將page和address_space相關聯。

當內存回收或頁面遷移的時候,內核路徑最終會調用到:

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的區間樹,對于每一個滿足條件的vma,調用try_to_unmap_one來找到pte并解除映射關系。

5.ksm頁的反向映射

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

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

當內存回收或頁面遷移的時候,內核路徑最終會調用到:

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頁面對應的節點,然后遍歷節點的hlist鏈表,拿到每一個anon_vma,然后就和上面介紹的匿名頁的反向映射一樣了,從anon_vma的紅黑樹中找到所有的vma,最后try_to_unmap_one來找到pte并解除映射關系。

6.總結

前面我們介紹了反向映射的三種類型,匿名頁,文件頁和ksm頁的反向映射,分別通過page所對應的的vma, address_space, stable_node結構來查找vma。當然我們只是介紹了Linux內核中的反向映射的冰山一角,主要是try_to_unmap函數,其實每種反向映射各個數據結構建立的過程錯綜復雜,一篇文章三言兩語也說不清楚,他們散落在Linux內核源代碼的進程創建fork,內存映射mmap,缺頁異常處理,文件系統等各個角落。

誠然,如果我們搞不清楚各種反正映射所對應的各種數據結構之間的關系,或者只是有一些概念上的了解,并沒有真正掌握這種機制的實現原理,對于我們來理解Linux內核虛擬內存管理來說是一種障礙,不懂得反向映射內存管理 中的很多問題是搞不明白的!

責任編輯:PSY

原文標題:深入剖析Linux內核反向映射機制

文章出處:【微信公眾號:Linuxer】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 映射
    +關注

    關注

    0

    文章

    47

    瀏覽量

    15861
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21742
  • 反向
    +關注

    關注

    0

    文章

    7

    瀏覽量

    7496

原文標題:深入剖析Linux內核反向映射機制

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    PCB繪制基礎知識

    電子發燒友網站提供《PCB繪制基礎知識.pdf》資料免費下載
    發表于 01-21 15:20 ?3次下載
    PCB繪制<b class='flag-5'>基礎知識</b>

    EMC基礎知識-華為

    EMC基礎知識-華為
    發表于 01-06 14:09 ?0次下載

    品質管理基礎知識

    品質管理基礎知識
    的頭像 發表于 11-01 11:08 ?410次閱讀
    品質管理<b class='flag-5'>基礎知識</b>

    Verilog HDL的基礎知識

    本文繼續介紹Verilog HDL基礎知識,重點介紹賦值語句、阻塞與非阻塞、循環語句、同步與異步、函數與任務語法知識
    的頭像 發表于 10-24 15:00 ?592次閱讀
    Verilog HDL的<b class='flag-5'>基礎知識</b>

    負載開關基礎知識

    電子發燒友網站提供《負載開關基礎知識.pdf》資料免費下載
    發表于 10-08 09:56 ?1次下載
    負載開關<b class='flag-5'>基礎知識</b>

    詳解linux內核的uevent機制

    linux內核中,uevent機制是一種內核和用戶空間通信的機制,用于通知用戶空間應用程序各種硬件更改或其他事件,比如插入或移除硬件設備(如USB驅動器或網絡接口)。uevent表示“用戶空間
    的頭像 發表于 09-29 17:01 ?932次閱讀

    全新的半導體基礎知識

    《全新的半導體基礎知識》首先對流行于電子書刊上數十年之久的經典半導體基礎知識中存在的謬誤進行了全方位的討論,然后以半導體內部結構為抓手,以G型半導體(客供電子型半導體)、H型半導體(主供電子型半導體
    的頭像 發表于 09-20 11:30 ?1370次閱讀
    全新的半導體<b class='flag-5'>基礎知識</b>

    超聲波傳感基礎知識

    電子發燒友網站提供《超聲波傳感基礎知識.pdf》資料免費下載
    發表于 09-04 10:21 ?0次下載
    超聲波傳感<b class='flag-5'>基礎知識</b>

    linux驅動程序如何加載進內核

    Linux系統中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序的編寫 驅動程序的編寫是Linux驅動開發的基礎。在編
    的頭像 發表于 08-30 15:02 ?589次閱讀

    Linux內核測試技術

    Linux 內核Linux操作系統的核心部分,負責管理硬件資源和提供系統調用接口。隨著 Linux 內核的不斷發展和更新,其復雜性和代碼規
    的頭像 發表于 08-13 13:42 ?583次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>測試技術

    Linux內核中頁表映射基礎知識

    大家在看內核代碼時會經常看的以上術語,但在ARM的芯片手冊中并沒有用到這些術語,而是使用L1,L2,L3頁表這種術語。
    的頭像 發表于 08-07 15:53 ?1111次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中頁表<b class='flag-5'>映射</b>的<b class='flag-5'>基礎知識</b>

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    電子元件基礎知識介紹

    電子發燒友網站提供《電子元件基礎知識介紹.pptx》資料免費下載
    發表于 03-15 16:48 ?86次下載

    光纖通信技術基礎知識

    電子發燒友網站提供《光纖通信技術基礎知識.ppt》資料免費下載
    發表于 03-06 15:53 ?0次下載

    FPGA基礎知識介紹

    電子發燒友網站提供《FPGA基礎知識介紹.pdf》資料免費下載
    發表于 02-23 09:45 ?32次下載
    真人娱乐城开户送钱| 百家乐官网baccarat| 网络百家乐大转轮| 贵定县| 百家乐有不有作弊| 太阳城开户网| 百家乐休闲游戏| 金钱豹娱乐| 百家乐在发牌技巧| 网络轮盘| 百家乐软件稳赚| 栾川县| 超级百家乐2龙虎斗| 盖州市| 真人百家乐做假| 百家乐官网翻天快播粤语| 游戏百家乐的玩法技巧和规则| 百家乐官网投注庄闲法| 威尼斯人娱乐官网| 真人百家乐官网博弈| 大发888 迅雷下载| 杨公24山向水法吉凶断| 3u娱乐城| 澳门百家乐新濠天地| 百家乐官网开户首选| 大发888为什么进不去| 百家乐官网高手论| 澳门赌场分布| 百家乐赢家| 澳门百家乐官网常赢打法| 威尼斯人娱乐场积分| 同乐城百家乐官网娱乐城| 丘北县| 百家乐对子的玩法| 百家乐官网庄闲路| 博彩游戏| 至尊百家乐网| 百家乐官网路单显示程序| 3d大赢家| 百家乐大赌场娱乐网规则| 百家乐官网电子发牌盒|