想要對(duì) RT-Smart 的物理頁(yè)內(nèi)存管理功能有所了解,需要熟悉相關(guān)代碼:
RT-Smart 頁(yè)初始化相關(guān)功能
物理頁(yè)分配算法伙伴系統(tǒng)的實(shí)現(xiàn)
物理頁(yè)管理初始化
在系統(tǒng)初始化早期,會(huì)先執(zhí)行 rt_page_init 函數(shù)來(lái)對(duì)物理頁(yè)管理所需要的數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化,下面是對(duì)這段代碼的詳細(xì)解釋:
1#defineARCH_PAGE_SHIFT12
2#defineARCH_PAGE_SIZE(1<>ARCH_PAGE_SHIFT;
40/*計(jì)算需要多少個(gè)頁(yè)的內(nèi)存用于存放管理頁(yè)數(shù)據(jù)結(jié)構(gòu)*/
41intmnr=(total+nr)/(nr+1);
42LOG_D("nr=0x%08x
",nr);
43LOG_D("total=0x%08x
",total);
44LOG_D("mnr=0x%08x
",mnr);
45page_start=(structpage*)reg.start;
46/*計(jì)算除去用于管理的內(nèi)存頁(yè),可用于物理頁(yè)分配的起始地址*/
47reg.start+=(mnr<>ARCH_PAGE_SHIFT;
51}
52LOG_D("align0x%08x0x%08x
",reg.start,reg.end);
53/*初始化空閑page分配鏈表*/
54for(i=0;isize_bits=ARCH_ADDRESS_WIDTH_BITS;
80p->ref_cnt=1;
81/*將相應(yīng)的管理頁(yè)結(jié)構(gòu)體加入到頁(yè)空閑鏈表上,
82由此可以知道物理頁(yè)空閑鏈表上掛接的是物理頁(yè)的管理結(jié)構(gòu)體*/
83_pages_free(p,size_bits-ARCH_PAGE_SHIFT);
84reg.start+=(1UL<
物理頁(yè)管理算法簡(jiǎn)介
伙伴系統(tǒng)在現(xiàn)代操作系統(tǒng)中被廣泛地用于分配連續(xù)的物理內(nèi)存頁(yè)。其基本思想是將物理內(nèi)存劃分成連續(xù)的塊,以塊作為基本單位進(jìn)行分配。不同塊的大小可以不同,但每個(gè)塊都由一個(gè)或多個(gè)連續(xù)的物理頁(yè)組成,物理頁(yè)的數(shù)量必須是 2 的 n 次冪( 0 <= n < 預(yù)設(shè)的最大值),其中預(yù)設(shè)的最大值將決定能夠分配的連續(xù)物理內(nèi)存區(qū)域的最大大小,一般由開發(fā)者根據(jù)實(shí)際需要指定。
當(dāng)一個(gè)請(qǐng)求需要分配 m 個(gè)物理頁(yè)時(shí),伙伴系統(tǒng)將尋找一個(gè)大小合適的塊,該塊包含 $2^n$ 個(gè)物理頁(yè),且滿足 $2^{n-1} < m < 2^n$。在處理分配請(qǐng)求的過(guò)程中,大的塊可以分裂成兩半,即兩個(gè)小一號(hào)的塊,這兩個(gè)塊互為伙伴。分裂得到塊可以繼續(xù)分裂,直到得到一個(gè)大小合適的塊去服務(wù)相應(yīng)的分配請(qǐng)求。在一個(gè)塊被釋放后,分配器會(huì)找到其伙伴塊,若伙伴塊頁(yè)處于空閑的狀態(tài),則將這兩個(gè)伙伴塊進(jìn)行合并沒(méi)形成一個(gè)大一號(hào)的空閑塊,然后繼續(xù)嘗試向上合并。由分裂操作和合并操作都是級(jí)聯(lián)的,因此能夠很好地緩解外部碎片的問(wèn)題。
下圖表達(dá)了伙伴系統(tǒng)的基本思想,基于伙伴塊進(jìn)行分裂與合并。

伙伴系統(tǒng)實(shí)現(xiàn)
在 RT-Smart 系統(tǒng)中,使用空閑鏈表數(shù)組來(lái)實(shí)現(xiàn)伙伴系統(tǒng)。具體來(lái)說(shuō),全局有一個(gè)有序數(shù)組,數(shù)組的每一項(xiàng)指向一條空閑鏈表,每條鏈表將其對(duì)應(yīng)大小的空閑塊連接起來(lái),一條鏈表中的空閑塊大小相同。當(dāng)接收到分配請(qǐng)求后,伙伴分配器首先算出應(yīng)該分配多大的空閑塊,然后查找對(duì)應(yīng)的空閑鏈表。
想要了解物理頁(yè)算法的實(shí)現(xiàn)過(guò)程,那就要熟悉物理頁(yè)的申請(qǐng)和釋放算法,也就是頁(yè)面釋放函數(shù) _pages_free 和物理頁(yè)申請(qǐng)函數(shù) _pages_alloc。
物理頁(yè)釋放
1staticint_pages_free(structpage*p,uint32_tsize_bits)
2{
3/*根據(jù)size_bits獲取當(dāng)前物理頁(yè)的大小*/
4uint32_tlevel=size_bits;
5uint32_thigh=ARCH_ADDRESS_WIDTH_BITS-size_bits-1;
6structpage*buddy;
7RT_ASSERT(p->ref_cnt>0);
8RT_ASSERT(p->size_bits==ARCH_ADDRESS_WIDTH_BITS);
9/*將該物理頁(yè)的引用計(jì)數(shù)減一,如果引用計(jì)數(shù)不為0則直接返回*/
10p->ref_cnt--;
11if(p->ref_cnt!=0)
12{
13return0;
14}
15/*判斷當(dāng)前頁(yè)大小是否比最大空閑頁(yè)小,如果大小為最大空閑頁(yè),則直接將該頁(yè)插入到最大空閑頁(yè)鏈表*/
16while(levelsize_bits==level)
22{
23page_remove(buddy,level);
24p=(p
物理頁(yè)申請(qǐng)


通過(guò)上面的物理頁(yè)釋放與分配過(guò)程,就實(shí)現(xiàn)了 RT-Smart 系統(tǒng)中的物理頁(yè)管理過(guò)程。
審核編輯:湯梓紅
-
內(nèi)存管理
+關(guān)注
關(guān)注
0文章
169瀏覽量
14845 -
管理算法
+關(guān)注
關(guān)注
0文章
3瀏覽量
5742
原文標(biāo)題:RT-Smart 物理頁(yè)內(nèi)存管理詳解
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
aicube項(xiàng)目頁(yè)初始化異常是怎么回事?
Linux內(nèi)存系統(tǒng): Linux 內(nèi)存分配算法
RT-Smart的資料合集
基于RT-Thread操作系統(tǒng)衍生rt-smart實(shí)時(shí)操作系統(tǒng)簡(jiǎn)介
基于Windows環(huán)境快速體驗(yàn)rt-smart相關(guān)資料介紹
Rt-Smart在riscv中的初始化流程
rt-smart應(yīng)用程序系統(tǒng)調(diào)用實(shí)現(xiàn)過(guò)程是怎么樣的?
樹莓派上rt-smart的應(yīng)用編程入門
rt-smart移植分析:從樹莓派3b入手
RT-Smart頁(yè)初始化相關(guān)功能及物理頁(yè)分配算法伙伴系統(tǒng)的實(shí)現(xiàn)
評(píng)論