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

評論