最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

詳解linux引導(dǎo)內(nèi)存分配器bootmem簡介

2022-09-15 17:53 作者:補給站Linux內(nèi)核  | 我要投稿

1.概述

linux系統(tǒng)中使用伙伴系統(tǒng)對物理頁面進(jìn)行分配管理,但是伙伴分配系統(tǒng)需要內(nèi)核完成初始化以及建立相關(guān)內(nèi)核數(shù)據(jù)結(jié)構(gòu)后才能夠正常工作。因此,我們不難看出在內(nèi)核初始化相關(guān)數(shù)據(jù)結(jié)構(gòu)時需要另一種內(nèi)存分配器。早期Linux沒有較為完善的引導(dǎo)內(nèi)存分配器,但是隨著硬件的發(fā)展和日趨復(fù)雜,處理不同體系的內(nèi)存分配代碼也漸漸復(fù)雜起來,隨之就需要引導(dǎo)內(nèi)存分配器來初始化系統(tǒng)主要內(nèi)存分配器的數(shù)據(jù)結(jié)構(gòu)以確保其正常工作。在內(nèi)核2.3.23版本中bootmem引導(dǎo)內(nèi)存分配器補丁被加入,使用位圖來表示頁面使用狀況。然后在內(nèi)核2.3.48版本時,linux內(nèi)核移植到IA64時正式使用bootmem作為引導(dǎo)內(nèi)存分配器。隨著時間的流逝,內(nèi)存檢測已經(jīng)從簡單地向BIOS詢問擴(kuò)展內(nèi)存塊的大小演變?yōu)樘幚韽?fù)雜的表,塊,庫和群集。這時開始使用memblock作為引導(dǎo)內(nèi)存分配器。在bootmem向memblock過渡時,出現(xiàn)nobootmem作為兼容層,提供與bootmem類似api。在內(nèi)核版本4.17時,在linux所支持的24種架構(gòu)中,只有5種仍在使用bootmem作為唯一的早期內(nèi)存分配器,14中將memblock與nobootmem一起使用,其余同時使用memblock和bootmem作為引導(dǎo)內(nèi)存分配器。今天主要介紹bootmem引導(dǎo)內(nèi)存分配器。

2.內(nèi)核數(shù)據(jù)結(jié)構(gòu)

首先查看bootmem_data數(shù)據(jù)結(jié)構(gòu),表示每個節(jié)點物理內(nèi)存以及其頁面使用情況。

node_min_pfn和node_low_pfn:表示該節(jié)點內(nèi)存物理頁面范圍:node_min_pfn為起始頁面,node_low_pfn則為結(jié)束頁面;

node_bootmem_map:指向位圖,每位表示內(nèi)存頁面使用情況,當(dāng)頁面可以被使用時,所對應(yīng)的位圖設(shè)為0,相反則設(shè)為1;

last_end_off:表示上次所分配內(nèi)存的物理地址相對bootmem起始頁面偏移(以字節(jié)計算);

hint_idx:記錄上次設(shè)置位圖的索引;

list:加入bootmem_data全局鏈表bdata_list;除了全局鏈表外,還存在bootmem_node_data所指向的bootmem_data全局?jǐn)?shù)組,索引為內(nèi)存對應(yīng)節(jié)點號;


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ?

3.相關(guān)函數(shù)

3.1 初始化bootmem_data

首先調(diào)用mminit_validate_memmodel_limits()函數(shù)檢查指定范圍物理頁面是否有效,然后初始化bootmem_data結(jié)構(gòu),其中mapstart指向所分配位圖頁面。link_bootmem()函數(shù)是將bootmem_data加入bdata_list鏈表中。最后將所有位圖設(shè)為1,即頁面目前不可用。

該函數(shù)將bootmem_data加入鏈表,bdata_list中節(jié)點順序是按照起始頁面從小到大排列。

3.2 釋放bootmem所保留的頁面

3.3 保留bootmem中頁面

該函數(shù)sidx和eidx表示鎖保留頁面的范圍,如果flags設(shè)置BOOTMEM_EXCLUSIVE標(biāo)志位則表示將指定范圍內(nèi)頁面從bootmem中釋放。

3.4 從bootmem中分配內(nèi)存

該函數(shù)size表示所需要分配多少字節(jié)的內(nèi)存,align表示分配內(nèi)存按多少字節(jié)對齊,goal表示分配內(nèi)存最小物理地址,limit表示分配內(nèi)存最大物理地址。首先對參數(shù)進(jìn)行檢驗,size不能為空,align必須為2的指數(shù),同時分配內(nèi)存不能超出范圍。


獲取bootmem所保留頁面范圍并重新計算所分配內(nèi)存起始物理頁面。

設(shè)置起始和結(jié)束索引,如果bootmem上次分配內(nèi)存頁面大于sidx則設(shè)置fallback。

首先獲取bootmem位圖在sidx和eidx范圍數(shù)個為0的索引,然后在進(jìn)行對齊獲取起始索引并重新計算結(jié)束索引,驗證是否超出bootmem所擁有頁面范圍,超出則退出循環(huán)分配失敗。否則進(jìn)入for循環(huán)在sidx和eidx遍歷查看是否存在頁面被bootmem保留,如果存在則以此索引為新sidx進(jìn)行設(shè)置,重新遍歷,相反則繼續(xù)進(jìn)行分配。根據(jù)bootmem上次分配內(nèi)存的偏移設(shè)置所分配內(nèi)存起始物理地址以及結(jié)束地址,最后設(shè)置這些頁面的位圖為1,即保留頁面。

檢查fallback是否為0,如果不為0則返回繼續(xù)進(jìn)行查找。

3.5 釋放bootmem中頁面

獲取bootmem頁面范圍以及位圖。

循環(huán)遍歷位圖釋放bootmem未進(jìn)行保留的頁面,即相應(yīng)位圖設(shè)為0的頁面。

注: 以上均為自己對linux內(nèi)核4.15.1源碼的分析。如果有不足之處,歡迎大家指出。




詳解linux引導(dǎo)內(nèi)存分配器bootmem簡介的評論 (共 條)

分享到微博請遵守國家法律
新蔡县| 利津县| 嵊州市| 肃南| 保靖县| 夹江县| 赤水市| 蒲城县| 响水县| 衡阳县| 甘洛县| 敦化市| 洛浦县| 平利县| 河东区| 孟州市| 阜新| 利川市| 丹东市| 舟山市| 扶沟县| 陆丰市| 宁晋县| 禹州市| 镇巴县| 武陟县| 昭觉县| 和硕县| 资兴市| 呼伦贝尔市| 屯门区| 黄梅县| 阳高县| 福泉市| 中阳县| 西充县| 西青区| 宝丰县| 奇台县| 敦化市| 莱阳市|