91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux內(nèi)核反向映射基礎(chǔ)知識(shí)詳解

Linux閱碼場(chǎng) ? 來源:Linuxer ? 作者:Linuxer ? 2020-11-26 14:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者簡(jiǎn)介

Cheetah,曾為U-boot社區(qū)和Linux內(nèi)核社區(qū)提交過若干補(bǔ)丁,主要從事Linux相關(guān)系統(tǒng)軟件開發(fā)工作,負(fù)責(zé)Soc芯片BringUp及系統(tǒng)軟件開發(fā),喜歡閱讀內(nèi)核源代碼,在不斷的學(xué)習(xí)和工作中深入理解內(nèi)存管理,進(jìn)程調(diào)度,文件系統(tǒng),設(shè)備驅(qū)動(dòng)等內(nèi)核子系統(tǒng)。

為了系統(tǒng)的安全性,Linux內(nèi)核將各個(gè)用戶進(jìn)程運(yùn)行在各自獨(dú)立的虛擬地址空間,用戶進(jìn)程之間通過虛擬地址空間相互隔離,不能相互訪問,一個(gè)進(jìn)程的奔潰不會(huì)影響到整個(gè)系統(tǒng)的異常也不會(huì)干擾到系統(tǒng)以及其他進(jìn)程運(yùn)行。

Linux內(nèi)核可以通過共享內(nèi)存的方式為系統(tǒng)節(jié)省大量?jī)?nèi)存,例如fork子進(jìn)程的時(shí)候,父子進(jìn)程通過只讀的方式共享所有的私有頁面。再比如通過IPC共享內(nèi)存方式,各個(gè)不相干的進(jìn)程直接可以共享一塊物理內(nèi)存等等。

我們都知道操作系統(tǒng)開啟mmu之后cpu訪問到的都是虛擬地址,當(dāng)cpu訪問一個(gè)虛擬地址的時(shí)候需要通過mmu將虛擬地址轉(zhuǎn)化為物理地址,這叫做正向映射。而與本文相關(guān)的是反向映射,它主要是通過物理頁來找到共享這個(gè)頁的所有的vma對(duì)應(yīng)的頁表項(xiàng),這是本文討論的問題。

本文目錄:
1.反向映射的發(fā)展
2.反向映射應(yīng)用場(chǎng)景
3.匿名頁的反向映射
4.文件頁的反向映射
5.ksm頁的反向映射
5.總結(jié)

注:反向映射機(jī)制是Linux內(nèi)核虛擬內(nèi)存管理的難點(diǎn)也是理解內(nèi)存管理的關(guān)鍵技術(shù)之一?。?/p>

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

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

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

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

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

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

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

2.反向映射應(yīng)用場(chǎng)景

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

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

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

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

3.匿名頁的反向映射

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


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

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

當(dāng)內(nèi)存回收或頁面遷移的時(shí)候,內(nèi)核路徑最終會(huì)調(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

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

4.文件頁的反向映射

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

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


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

當(dāng)內(nèi)存回收或頁面遷移的時(shí)候,內(nèi)核路徑最終會(huì)調(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

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

5.ksm頁的反向映射

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

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

當(dāng)內(nèi)存回收或頁面遷移的時(shí)候,內(nèi)核路徑最終會(huì)調(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

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

6.總結(jié)

前面我們介紹了反向映射的三種類型,匿名頁,文件頁和ksm頁的反向映射,分別通過page所對(duì)應(yīng)的的vma, address_space, stable_node結(jié)構(gòu)來查找vma。當(dāng)然我們只是介紹了Linux內(nèi)核中的反向映射的冰山一角,主要是try_to_unmap函數(shù),其實(shí)每種反向映射各個(gè)數(shù)據(jù)結(jié)構(gòu)建立的過程錯(cuò)綜復(fù)雜,一篇文章三言兩語也說不清楚,他們散落在Linux內(nèi)核源代碼的進(jìn)程創(chuàng)建fork,內(nèi)存映射mmap,缺頁異常處理,文件系統(tǒng)等各個(gè)角落。

誠然,如果我們搞不清楚各種反正映射所對(duì)應(yīng)的各種數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系,或者只是有一些概念上的了解,并沒有真正掌握這種機(jī)制的實(shí)現(xiàn)原理,對(duì)于我們來理解Linux內(nèi)核虛擬內(nèi)存管理來說是一種障礙,不懂得反向映射內(nèi)存管理 中的很多問題是搞不明白的!

責(zé)任編輯:PSY

原文標(biāo)題:深入剖析Linux內(nèi)核反向映射機(jī)制

文章出處:【微信公眾號(hào):Linuxer】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 映射
    +關(guān)注

    關(guān)注

    0

    文章

    49

    瀏覽量

    16472
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    321

    瀏覽量

    23202
  • 反向
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    7626

原文標(biāo)題:深入剖析Linux內(nèi)核反向映射機(jī)制

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請(qǐng)函數(shù)詳解:從原理到實(shí)戰(zhàn)

    Linux 內(nèi)核中,內(nèi)存管理是整個(gè)系統(tǒng)穩(wěn)定運(yùn)行的基石,而伙伴系統(tǒng)(Buddy System) 作為內(nèi)核物理內(nèi)存分配的核心機(jī)制,更是驅(qū)動(dòng)開發(fā)、內(nèi)核模塊開發(fā)的必備
    的頭像 發(fā)表于 02-10 16:58 ?3630次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>伙伴系統(tǒng)內(nèi)存申請(qǐng)函數(shù)<b class='flag-5'>詳解</b>:從原理到實(shí)戰(zhàn)

    阻燃系列基礎(chǔ)知識(shí)

    我很榮幸有機(jī)會(huì)在這里與大家分享我對(duì)阻燃系列基礎(chǔ)知識(shí)的研究。今天,我們將探討的主題是“阻燃系列基礎(chǔ)知識(shí)”。在我們?nèi)粘I钪?,火?zāi)事故頻發(fā),造成巨大的財(cái)產(chǎn)損失和人員傷亡。因此,了解阻燃材料的基礎(chǔ)知識(shí)對(duì)于
    的頭像 發(fā)表于 02-06 08:07 ?246次閱讀
    阻燃系列<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

    Linux 內(nèi)核的世界里,有一個(gè)默默工作的 "計(jì)時(shí)器"——jiffies。它不像我們手機(jī)上的時(shí)鐘那樣顯示年月日,卻掌控著內(nèi)核中絕大多數(shù)時(shí)間相關(guān)的操作:從進(jìn)程調(diào)度到設(shè)備驅(qū)動(dòng)的定時(shí)檢查,都離不開它的身影。
    的頭像 發(fā)表于 02-04 16:27 ?816次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

    Linux系統(tǒng)內(nèi)核參數(shù)調(diào)優(yōu)實(shí)戰(zhàn)指南

    Linux 內(nèi)核參數(shù)調(diào)優(yōu)是系統(tǒng)性能優(yōu)化的核心環(huán)節(jié)。隨著云原生架構(gòu)的普及和硬件性能的飛速提升,默認(rèn)的內(nèi)核參數(shù)配置往往無法充分發(fā)揮系統(tǒng)潛力。在高并發(fā) Web 服務(wù)、大數(shù)據(jù)處理、容器化部署等場(chǎng)景下,合理的
    的頭像 發(fā)表于 01-28 14:27 ?426次閱讀

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配

    *kmalloc(size_t size, int flags);”函數(shù)。 通過對(duì)這章的學(xué)習(xí),深刻體會(huì)到Linux內(nèi)核的內(nèi)存分配管理機(jī)制博大精深,有些知識(shí)點(diǎn)還是初次觸碰到,當(dāng)然也有一些耳熟能詳?shù)母拍?,比如“?/div>
    發(fā)表于 01-16 20:05

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】+讀內(nèi)核處理的核心輔助函數(shù)

    上周收到《Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)》書籍,這是一本介紹Linux內(nèi)核開發(fā)的指導(dǎo)性書籍。全面了解Linux內(nèi)核所提供的一些接口函
    發(fā)表于 01-10 22:08

    無刷電機(jī)驅(qū)動(dòng)器的基礎(chǔ)知識(shí)

    本文將從技術(shù)角度出發(fā),對(duì)三相無刷電機(jī)的電機(jī)驅(qū)動(dòng)器的作用、種類和規(guī)格進(jìn)行介紹。通過本文,您可以學(xué)習(xí)到電機(jī)驅(qū)動(dòng)器選型所需的基礎(chǔ)知識(shí)。
    的頭像 發(fā)表于 12-10 14:13 ?6677次閱讀
    無刷電機(jī)驅(qū)動(dòng)器的<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    Linux驅(qū)動(dòng)開發(fā)的必備知識(shí)

    內(nèi)核基礎(chǔ)知識(shí): 1、熟悉 Linux 內(nèi)核的架構(gòu)、模塊系統(tǒng)、進(jìn)程管理、內(nèi)存管理等。 了解內(nèi)核的編譯和加載過程。 2、C編程技能: 精
    發(fā)表于 12-04 07:58

    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568開發(fā)板Linux驅(qū)動(dòng)開發(fā)實(shí)戰(zhàn):RK3568內(nèi)核模塊符號(hào)導(dǎo)出詳解

    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568開發(fā)板Linux驅(qū)動(dòng)開發(fā)實(shí)戰(zhàn):RK3568內(nèi)核模塊符號(hào)導(dǎo)出詳解
    的頭像 發(fā)表于 11-21 13:25 ?1185次閱讀
    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568開發(fā)板<b class='flag-5'>Linux</b>驅(qū)動(dòng)開發(fā)實(shí)戰(zhàn):RK3568<b class='flag-5'>內(nèi)核</b>模塊符號(hào)導(dǎo)出<b class='flag-5'>詳解</b>

    【書籍評(píng)測(cè)活動(dòng)NO.67】成為硬核Linux開發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)》

    ——這便是《Linux 設(shè)備驅(qū)動(dòng)開發(fā)》。本書從基礎(chǔ)知識(shí)出發(fā),分專題透徹講解Linux環(huán)境下的設(shè)備驅(qū)動(dòng)開發(fā)知識(shí),幫助讀者從零構(gòu)建驅(qū)動(dòng)程序。如今4年過去,作者緊跟技術(shù)發(fā)展,對(duì)內(nèi)容進(jìn)行了大量
    發(fā)表于 11-17 17:52

    視覺工程師必須知道的工業(yè)相機(jī)基礎(chǔ)知識(shí)

    工業(yè)相機(jī)基礎(chǔ)知識(shí)概述。
    的頭像 發(fā)表于 09-19 17:04 ?1268次閱讀
    視覺工程師必須知道的工業(yè)相機(jī)<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    如何配置和驗(yàn)證Linux內(nèi)核參數(shù)

    Linux系統(tǒng)運(yùn)維和性能優(yōu)化中,內(nèi)核參數(shù)(sysctl)的配置至關(guān)重要。合理的參數(shù)調(diào)整可以顯著提升網(wǎng)絡(luò)性能、系統(tǒng)穩(wěn)定性及資源利用率。然而,僅僅修改參數(shù)是不夠的,如何驗(yàn)證這些參數(shù)是否生效同樣關(guān)鍵。
    的頭像 發(fā)表于 05-29 17:40 ?1150次閱讀

    效果器的基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《效果器的基礎(chǔ)知識(shí).doc》資料免費(fèi)下載
    發(fā)表于 03-26 14:30 ?7次下載

    樹莓派4 性能大比拼:標(biāo)準(zhǔn)Linux與實(shí)時(shí)Linux 4.19內(nèi)核的延遲測(cè)試

    引言本文是對(duì)我之前關(guān)于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標(biāo)準(zhǔn)內(nèi)核,以及應(yīng)用了RT補(bǔ)丁的相似內(nèi)核版本。對(duì)于實(shí)時(shí)版,我
    的頭像 發(fā)表于 03-25 09:39 ?809次閱讀
    樹莓派4 性能大比拼:標(biāo)準(zhǔn)<b class='flag-5'>Linux</b>與實(shí)時(shí)<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內(nèi)核</b>的延遲測(cè)試

    開關(guān)電源的基礎(chǔ)知識(shí)題目及答案(免積分)

    本文含有開關(guān)電源的基礎(chǔ)知識(shí)題目及答案,下載附件即可查看!
    發(fā)表于 03-06 15:52