chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

mlock如何鎖住進(jìn)程地址空間關(guān)聯(lián)的物理內(nèi)存

Linux閱碼場(chǎng) ? 來(lái)源:Linux閱碼場(chǎng) ? 作者:Linux閱碼場(chǎng) ? 2022-03-14 09:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一般用戶(hù)空間關(guān)聯(lián)的物理頁(yè)面是按需通過(guò)缺頁(yè)異常的方式分配和調(diào)頁(yè),當(dāng)系統(tǒng)物理內(nèi)存不足時(shí)頁(yè)面回收算法會(huì)回收一些最近很少使用的頁(yè)面,但是有時(shí)候我們需要鎖住一些物理頁(yè)面防止其被回收(如時(shí)間有嚴(yán)格要求的應(yīng)用),Linux中提供了mlock相關(guān)的系統(tǒng)調(diào)用供用戶(hù)空間使用來(lái)鎖住部分或全部的地址空間關(guān)聯(lián)的物理頁(yè)面。 本文的分析基于arm64處理器架構(gòu),內(nèi)核版本為L(zhǎng)inux-5.10.27,我們會(huì)結(jié)合重點(diǎn)內(nèi)核源代碼來(lái)解析mlock是如何做到鎖住進(jìn)程地址空間關(guān)聯(lián)的物理內(nèi)存的,又是如何防止相關(guān)的物理頁(yè)面被交換出去的。

一、主動(dòng)缺頁(yè)

mlock的主要代碼處理流程如下,這里我們主要關(guān)注主動(dòng)缺頁(yè)部分:

6808a960-9fc5-11ec-952b-dac502259ad0.png

mlock處理路徑中,會(huì)將VM_LOCKED標(biāo)志加入到vma->vm_flags中(由于設(shè)置的地址區(qū)域有可能跨越多個(gè)vma,所以代碼中會(huì)涉及到分裂和合并的操作,實(shí)質(zhì)上都會(huì)設(shè)置相關(guān)的vma->vm_flags的VM_LOCKED標(biāo)志),然后會(huì)調(diào)用__mm_populate來(lái)填充虛擬頁(yè)對(duì)應(yīng)的物理頁(yè),最終在faultin_page函數(shù)中試圖查找vma中的每個(gè)虛擬頁(yè)對(duì)應(yīng)的物理頁(yè)面(對(duì)應(yīng)于follow_page_mask函數(shù)),如果沒(méi)有找到會(huì)調(diào)用handle_mm_fault主動(dòng)觸發(fā)缺頁(yè)處理。 handle_mm_fault函數(shù)是內(nèi)核通用的缺頁(yè)異常處理例程,如vma是匿名映射的則分配物理頁(yè)面然后建立頁(yè)表映射關(guān)系,vma是文件映射則會(huì)從磁盤(pán)讀取對(duì)應(yīng)的文件頁(yè)(如果page cache沒(méi)有對(duì)應(yīng)頁(yè)面時(shí))到內(nèi)存的page cache,然后建立虛擬頁(yè)面建立頁(yè)表映射關(guān)系。

二、內(nèi)存回收處理

1. 掃描活躍的lru鏈表

內(nèi)存回收掃描活躍的lru鏈表時(shí),對(duì)于設(shè)定了VM_LOCKED的vma處理鏈路如下:

68239090-9fc5-11ec-952b-dac502259ad0.png

可以看到:當(dāng)掃描活躍的lru鏈表的時(shí)候,會(huì)通過(guò)反向映射機(jī)制查找到映射這個(gè)物理頁(yè)面的每個(gè)vma, 對(duì)于設(shè)置了vma->vm_flags 的VM_LOCKED標(biāo)志的vma來(lái)說(shuō)直接退出反向映射處理即可,不需要進(jìn)行訪(fǎng)問(wèn)計(jì)數(shù)的統(tǒng)計(jì)工作,本身這樣的物理頁(yè)面就需要常駐內(nèi)存不要進(jìn)行回收。

2.掃描不活躍的lru鏈表

內(nèi)存回收掃描不活躍的lru鏈表時(shí),對(duì)于設(shè)定了VM_LOCKED的vma處理鏈路如下:

6836084c-9fc5-11ec-952b-dac502259ad0.png

可以看到:調(diào)用鏈中也會(huì)調(diào)用page_referenced 函數(shù)通過(guò)反向映射機(jī)制查找到映射這個(gè)物理頁(yè)面的每個(gè)vma, 對(duì)于設(shè)置了vma->vm_flags 的VM_LOCKED標(biāo)志的vma來(lái)說(shuō)直接退出反向映射處理即可,返回到page_check_references函數(shù)時(shí),判斷如果有vma設(shè)置了VM_LOCKED標(biāo)志就會(huì)返回PAGEREF_RECLAIM到shrink_page_list函數(shù)接著處理。 shrink_page_list函數(shù)在處理完page_check_references之后,就進(jìn)行回收處理,對(duì)于頁(yè)表映射頁(yè)會(huì)調(diào)用try_to_unmap來(lái)解除頁(yè)表映射。

3.反向映射處理

shrink_page_list在回收物理頁(yè)面之前會(huì)調(diào)用try_to_unmap來(lái)解除映射到這個(gè)頁(yè)面所有頁(yè)表項(xiàng),相關(guān)處理如下:

684fd8bc-9fc5-11ec-952b-dac502259ad0.png

對(duì)于映射到這個(gè)物理頁(yè)的每個(gè)vma來(lái)說(shuō),如果vma->vm_flags設(shè)置了VM_LOCKED標(biāo)志,則會(huì)調(diào)用mlock_vma_page來(lái)做mlock處理,然后返回false,結(jié)束反向映射處理。 下面我們來(lái)看mlock_vma_page做了什么事情:

6867d480-9fc5-11ec-952b-dac502259ad0.png

可以看到:mlock_vma_page首先設(shè)置頁(yè)描述符的PG_mlocked標(biāo)志,然后會(huì)zone的NR_MLOCK頁(yè)面記賬,然后會(huì)將頁(yè)面從原來(lái)的lru鏈表中隔離出來(lái),最后會(huì)將頁(yè)面加入不可回收的lru中(這個(gè)代碼大家自行閱讀,實(shí)際上是判斷頁(yè)描述符的PG_mlocked標(biāo)志)。

mlock_vma_page處理的重點(diǎn)就是將頁(yè)面加入到不可回收的lru鏈表,這樣內(nèi)存回收的時(shí)候就不會(huì)在掃描到這樣的頁(yè)面了。

mlock的整個(gè)過(guò)程如下圖所示:

6887a3aa-9fc5-11ec-952b-dac502259ad0.png

三、munlock處理

munlock會(huì)解除原來(lái)鎖住的頁(yè)面,處理路徑如下:

68bf2c58-9fc5-11ec-952b-dac502259ad0.png

當(dāng)然代碼中也會(huì)有對(duì)應(yīng)的vma的分裂處理,主要處理為:清除vma的VM_LOCKED標(biāo)志,清除頁(yè)描述符的PG_mlocked標(biāo)志,最后就會(huì)將原來(lái)在不可回收的lru中的頁(yè)面重新加入對(duì)應(yīng)的lru鏈表中。 這里還有一個(gè)細(xì)節(jié),那就是有可能這個(gè)頁(yè)面對(duì)多個(gè)vma共享,所以會(huì)通過(guò)try_to_munlock來(lái)處理,處理路徑如下:

68d7e3e2-9fc5-11ec-952b-dac502259ad0.png

會(huì)通過(guò)反向映射機(jī)制,遍歷這樣頁(yè)對(duì)應(yīng)的所有vma,如果傳遞的ttu_flags為T(mén)TU_MUNLOCK且vma->vm_flags沒(méi)有設(shè)置VM_LOCKED標(biāo)志,則直接返回,檢查下一個(gè)vma;如果有一個(gè)vma設(shè)置了VM_LOCKED標(biāo)志,說(shuō)明這個(gè)頁(yè)面還不能被回收,就會(huì)通過(guò)mlock_vma_page函數(shù)重新將頁(yè)面加入到不可回收的lru鏈表。 munlock的整個(gè)處理過(guò)程如下圖:

68f2923c-9fc5-11ec-952b-dac502259ad0.png

四、總結(jié)

對(duì)于一些對(duì)時(shí)間有嚴(yán)格要求的應(yīng)用場(chǎng)景,訪(fǎng)問(wèn)時(shí)按需分配和調(diào)頁(yè)機(jī)制的時(shí)延可能是未知的,內(nèi)核中提供了mlock相關(guān)的系統(tǒng)調(diào)用,用于將虛擬內(nèi)存區(qū)域?qū)?yīng)的物理頁(yè)面“鎖在”內(nèi)存中。內(nèi)核對(duì)應(yīng)mlock鎖住的頁(yè)面實(shí)際上它主要做了兩步比較重要的操作:1,調(diào)用mlock的時(shí)候就將所需要的物理頁(yè)面準(zhǔn)備好;2,內(nèi)存回收時(shí)當(dāng)掃描到相關(guān)的物理頁(yè)面時(shí),將其放入不可回收的lru鏈表。第一步保證訪(fǎng)問(wèn)的虛擬地址對(duì)應(yīng)的物理頁(yè)面在內(nèi)存中,第二步保證了鎖住的頁(yè)面不會(huì)被回收。

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

    關(guān)注

    135

    文章

    9554

    瀏覽量

    392117
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    9

    文章

    3212

    瀏覽量

    76387

原文標(biāo)題:mlock鎖原理剖析

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Linux內(nèi)核大塊內(nèi)存申請(qǐng):從場(chǎng)景到落地全解析

    網(wǎng)卡、硬盤(pán)等外設(shè)的 DMA 控制器,要求內(nèi)存物理地址連續(xù)(無(wú)法識(shí)別虛擬地址映射),且需一次性分配大尺寸緩沖區(qū)(如 1GB 網(wǎng)絡(luò)幀緩存)。
    的頭像 發(fā)表于 02-09 16:41 ?684次閱讀
    Linux內(nèi)核大塊<b class='flag-5'>內(nèi)存</b>申請(qǐng):從場(chǎng)景到落地全解析

    Linux下擴(kuò)充Swap交換空間:解決內(nèi)存不足的實(shí)用指南,這些影響要注意!

    大家在使用 Linux 系統(tǒng)(比如常用的 Ubuntu)時(shí),是不是偶爾會(huì)遇到 “內(nèi)存不足” 的彈窗?比如運(yùn)行大型編譯任務(wù)、多開(kāi)虛擬機(jī)、做數(shù)據(jù)分析,或者把 Linux 當(dāng)服務(wù)器用的時(shí)候,物理內(nèi)存一旦 “告急”,系統(tǒng)就會(huì)卡頓甚至崩潰
    的頭像 發(fā)表于 02-09 16:33 ?225次閱讀
    Linux下擴(kuò)充Swap交換<b class='flag-5'>空間</b>:解決<b class='flag-5'>內(nèi)存</b>不足的實(shí)用指南,這些影響要注意!

    飛凌嵌入式ElfBoard-進(jìn)程之什么是進(jìn)程

    進(jìn)程是正在執(zhí)行(已經(jīng)開(kāi)始執(zhí)行但還沒(méi)終止的)的程序?qū)嵗?,?zhí)行程序時(shí),內(nèi)核會(huì)將程序載入虛擬內(nèi)存,為程序變量分配空間,建立內(nèi)核記賬(bookkeeping)數(shù)據(jù)結(jié)構(gòu),以記錄與進(jìn)程有關(guān)的各種信
    發(fā)表于 01-26 08:42

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

    ,目前4KB是廣泛使用的頁(yè)大小。在Linux操作系統(tǒng)中,每個(gè)進(jìn)程甚至內(nèi)核本身都被分配了地址空間,這是處理器的虛擬地址空間的一部分,內(nèi)核和
    發(fā)表于 01-16 20:05

    進(jìn)程通信

    訪(fǎng)問(wèn)的共享空間,通過(guò)對(duì)這片共享空間進(jìn)行寫(xiě)/讀操作實(shí)現(xiàn)進(jìn)程之間的信息交換。在對(duì)共享空間進(jìn)行寫(xiě)/讀操作時(shí),需要使用同步互斥工具(如 P操作、V操作),對(duì)共享
    發(fā)表于 01-15 06:16

    進(jìn)程的控制

    內(nèi)存空間(在PCB 中體現(xiàn))。注意:這里如果資源不足(比如內(nèi)存空間),并不是創(chuàng)建失敗,而是處于”等待狀態(tài)“,或稱(chēng)為“阻塞狀態(tài)”,等待的是內(nèi)存這個(gè)資源。   3. 初始化PCB,主要包括初始化標(biāo)志信息
    發(fā)表于 01-15 06:05

    解析Linux的進(jìn)程、線(xiàn)程和協(xié)程

    進(jìn)程間通信(IPC):Linux提供了多種IPC機(jī)制,如管道、信號(hào)、共享內(nèi)存和消息隊(duì)列,用于進(jìn)程之間的通信。 線(xiàn)程管理 在Linux中,線(xiàn)程可以通過(guò)pthread庫(kù)來(lái)管理。線(xiàn)程共享同一進(jìn)程
    發(fā)表于 12-22 11:00

    rk基于linux/android內(nèi)存管理

    一、內(nèi)存分布 ? U-Boot 由前級(jí) Loader 加載到 CONFIG_SYS_TEXT_BASE 地址,初始化時(shí)會(huì)探明當(dāng)前系統(tǒng)的總內(nèi)存容 量, 32 位平臺(tái)上認(rèn)為最大 4GB 可用(但是不影響
    的頭像 發(fā)表于 12-15 10:42 ?217次閱讀
    rk基于linux/android<b class='flag-5'>內(nèi)存</b>管理

    Linux Swap交換空間詳解:Android編譯內(nèi)存不足?這樣擴(kuò)充立竿見(jiàn)影

    ? ? 在 ?Linux? 系統(tǒng)使用過(guò)程中,你是否遇到過(guò)? “ 內(nèi)存不足 ”? 的報(bào)錯(cuò)?比如編譯? Android? 源碼時(shí),明明按教程操作,卻因物理內(nèi)存沒(méi)達(dá)到? 16G? 要求而編譯中斷?這正是
    的頭像 發(fā)表于 12-06 08:10 ?4277次閱讀

    請(qǐng)問(wèn)e203定義的地址空間是虛擬地址還是物理地址

    ; RED_LED_OFFSET); GPIO_REG為基地址,GPIO_OUTPUT_VAL為偏移量,從而確定了要操作的寄存器的絕對(duì)地址。 同樣地,在做上電復(fù)位時(shí),可以配置pc_rtvec使得程序從不同的內(nèi)存空間啟動(dòng)。
    發(fā)表于 11-11 06:20

    如何為蜂鳥(niǎo)添加DDR內(nèi)存擴(kuò)展

    本隊(duì)伍編號(hào)CICC3042,本文介紹如何為蜂鳥(niǎo)添加DDR內(nèi)存擴(kuò)展。一些需要大存儲(chǔ)空間的設(shè)計(jì)中經(jīng)常需要使用DDR,這時(shí)我們希望蜂鳥(niǎo)可以訪(fǎng)問(wèn)DDR,以實(shí)現(xiàn)更好的軟硬件協(xié)同。 簡(jiǎn)單閱讀蜂鳥(niǎo)的代碼發(fā)現(xiàn)
    發(fā)表于 10-31 06:07

    通過(guò)sysmem接口擴(kuò)展內(nèi)存空間

    存儲(chǔ)器的訪(fǎng)問(wèn)接口,在e203_subsys_mems.v文件中可以找到: 同時(shí)在這個(gè)源文件中實(shí)現(xiàn)了一主多從的總線(xiàn)系統(tǒng),可以看到sysmem被分配到0x80000000到0xFFFFFFFF的地址空間
    發(fā)表于 10-24 08:12

    DSP仿真器下載報(bào)錯(cuò),似乎是地址映射問(wèn)題還是FLASH鎖住

    dsp下載程序報(bào)錯(cuò),仿真器連接是沒(méi)錯(cuò)的,開(kāi)發(fā)板為F28335,仿真器為XDS100v1,程序下載為仿真器時(shí)報(bào)錯(cuò),問(wèn)題還沒(méi)有解決,請(qǐng)大神解答,下面是以為FLASH鎖住了,然后自己去嘗試解鎖的報(bào)錯(cuò)。
    發(fā)表于 07-11 20:44

    工業(yè)APP頻繁崩潰?聚徽廠家分享安卓工控機(jī)內(nèi)存碎片化與進(jìn)程管理優(yōu)化指南

    進(jìn)程管理兩大核心維度,深入剖析崩潰根源,并提出系統(tǒng)性?xún)?yōu)化方案。 一、內(nèi)存碎片化:工業(yè)APP崩潰的隱形推手 1. 內(nèi)存碎片化的成因與危害 內(nèi)存碎片化是指
    的頭像 發(fā)表于 06-10 10:24 ?547次閱讀

    進(jìn)程、線(xiàn)程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    :操作系統(tǒng)分配資源的最小單位,自帶「獨(dú)立戶(hù)口本」(虛擬地址空間)和「保鏢團(tuán)隊(duì)」(系統(tǒng)級(jí)資源)。 技術(shù)細(xì)節(jié): 每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間(就像你家的房子,別人不能隨便進(jìn)) 創(chuàng)建
    發(fā)表于 03-26 09:27