想要對 RT-Smart 的物理頁內(nèi)存管理功能有所了解,需要熟悉相關(guān)代碼:
RT-Smart 頁初始化相關(guān)功能
物理頁分配算法伙伴系統(tǒng)的實現(xiàn)
物理頁管理初始化
在系統(tǒng)初始化早期,會先執(zhí)行 rt_page_init 函數(shù)來對物理頁管理所需要的數(shù)據(jù)結(jié)構(gòu)進行初始化,下面是對這段代碼的詳細解釋:
1#defineARCH_PAGE_SHIFT12 2#defineARCH_PAGE_SIZE(1<>ARCH_PAGE_SHIFT; 40/*計算需要多少個頁的內(nèi)存用于存放管理頁數(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/*計算除去用于管理的內(nèi)存頁,可用于物理頁分配的起始地址*/ 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/*將相應的管理頁結(jié)構(gòu)體加入到頁空閑鏈表上, 82由此可以知道物理頁空閑鏈表上掛接的是物理頁的管理結(jié)構(gòu)體*/ 83_pages_free(p,size_bits-ARCH_PAGE_SHIFT); 84reg.start+=(1UL<
物理頁管理算法簡介
伙伴系統(tǒng)在現(xiàn)代操作系統(tǒng)中被廣泛地用于分配連續(xù)的物理內(nèi)存頁。其基本思想是將物理內(nèi)存劃分成連續(xù)的塊,以塊作為基本單位進行分配。不同塊的大小可以不同,但每個塊都由一個或多個連續(xù)的物理頁組成,物理頁的數(shù)量必須是 2 的 n 次冪( 0 <= n < 預設的最大值),其中預設的最大值將決定能夠分配的連續(xù)物理內(nèi)存區(qū)域的最大大小,一般由開發(fā)者根據(jù)實際需要指定。
當一個請求需要分配 m 個物理頁時,伙伴系統(tǒng)將尋找一個大小合適的塊,該塊包含 $2^n$ 個物理頁,且滿足 $2^{n-1} < m < 2^n$。在處理分配請求的過程中,大的塊可以分裂成兩半,即兩個小一號的塊,這兩個塊互為伙伴。分裂得到塊可以繼續(xù)分裂,直到得到一個大小合適的塊去服務相應的分配請求。在一個塊被釋放后,分配器會找到其伙伴塊,若伙伴塊頁處于空閑的狀態(tài),則將這兩個伙伴塊進行合并沒形成一個大一號的空閑塊,然后繼續(xù)嘗試向上合并。由分裂操作和合并操作都是級聯(lián)的,因此能夠很好地緩解外部碎片的問題。
下圖表達了伙伴系統(tǒng)的基本思想,基于伙伴塊進行分裂與合并。
伙伴系統(tǒng)實現(xiàn)
在 RT-Smart 系統(tǒng)中,使用空閑鏈表數(shù)組來實現(xiàn)伙伴系統(tǒng)。具體來說,全局有一個有序數(shù)組,數(shù)組的每一項指向一條空閑鏈表,每條鏈表將其對應大小的空閑塊連接起來,一條鏈表中的空閑塊大小相同。當接收到分配請求后,伙伴分配器首先算出應該分配多大的空閑塊,然后查找對應的空閑鏈表。
想要了解物理頁算法的實現(xiàn)過程,那就要熟悉物理頁的申請和釋放算法,也就是頁面釋放函數(shù) _pages_free 和物理頁申請函數(shù) _pages_alloc。
物理頁釋放
1staticint_pages_free(structpage*p,uint32_tsize_bits) 2{ 3/*根據(jù)size_bits獲取當前物理頁的大小*/ 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/*將該物理頁的引用計數(shù)減一,如果引用計數(shù)不為0則直接返回*/ 10p->ref_cnt--; 11if(p->ref_cnt!=0) 12{ 13return0; 14} 15/*判斷當前頁大小是否比最大空閑頁小,如果大小為最大空閑頁,則直接將該頁插入到最大空閑頁鏈表*/ 16while(levelsize_bits==level) 22{ 23page_remove(buddy,level); 24p=(p
物理頁申請
通過上面的物理頁釋放與分配過程,就實現(xiàn)了 RT-Smart 系統(tǒng)中的物理頁管理過程。
審核編輯:湯梓紅
-
內(nèi)存管理
+關(guān)注
關(guān)注
0文章
168瀏覽量
14190 -
管理算法
+關(guān)注
關(guān)注
0文章
3瀏覽量
5689
原文標題:RT-Smart 物理頁內(nèi)存管理詳解
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論