嵌入式系統中的記憶體管理,主要用於實現記憶體的動態申請/釋放;在嵌入式作業系統中,使用malloc/free這兩個函式會產生記憶體碎片;並且這兩個函式的執行時間存在不確定性;
爭取對以下嵌入式作業系統的記憶體管理機制有一定的認識:
1、uc/os上使用的記憶體管理機制
2、典型值的記憶體管理機制
3、基於夥伴演算法的記憶體管理機制
一、uc/os上使用的記憶體管理機制
(一)基本原理
首先將一塊大的記憶體堆分為若干個分割槽,每個分割槽又分割成若干個記憶體塊,這些記憶體塊的大小是相同的;不同記憶體分割槽中記憶體塊的大小是不同的;利用這種「分區分塊」機制,使得記憶體申請/釋放的時間固定下來;
其次,應用在申請記憶體時可以在不同的分割槽得到不同大小記憶體塊,特定的記憶體塊在釋放時,必須重新歸還到他所屬的記憶體分割槽;採用上面這種演算法,可以解決記憶體碎片的問題。
(二)資料結構實現
記憶體分割槽採用os_mem結構體進行表述
typedef struct os_mem os_mem;
(三)具體函式實現
1、記憶體管理器初始化
osmeminit()函式初始化多個記憶體分割槽管理結構體(os_mem);
2、初始化記憶體分割槽中的記憶體控制塊
osmemcreate函式將記憶體分割槽中的記憶體塊使用單向鍊錶連線起來;
該函式建立並初始化乙個用於動態記憶體分配的區域,該記憶體區域包含指定數目的、大小確定的記憶體塊。應用可以動態申請這些記憶體塊並在用完後將其釋放回這個記憶體區域。該函式的返回值就是指向這個記憶體區域控制塊的指標,並作為osmemget(),osmemput(),osmemquery() 等相關呼叫的引數。
3、申請記憶體塊
osmemgut函式從指定的記憶體分割槽中獲取記憶體塊;
該函式用於從記憶體分割槽分配乙個記憶體塊。使用者程式必須知道所建立的記憶體塊的大小,並必須在使用完記憶體塊後釋放它。可以多次呼叫 osmemget() 函式。它的返回值就是指向所分配記憶體塊的指標,並作為 osmemput() 函式的引數。
4、釋放記憶體塊
osmemput函式將指定記憶體塊釋放到所屬的記憶體分割槽中;
該函式用於釋放乙個記憶體塊,記憶體塊必須釋放回它原先所在的記憶體分割槽,否則會造成系統錯誤。
(四)優缺點
需要應用程式人為的去判斷所需要的記憶體大小對應的記憶體塊,進而尋找相應的記憶體分割槽。並沒有從根本上解決記憶體碎片的問題,或者說,使用了較為低階記憶體分割槽的策略解決了記憶體碎片的問題,這也導致了使用者要提前規劃記憶體分割槽的型別。
二、典型值的記憶體管理機制
(一)基本原理
首先獲得一塊大的記憶體堆,然後設計了若干個嵌入式應用開發過程中可能用到的記憶體大小的典型值;
當應用需要申請記憶體時,根據申請記憶體的大小,計算出比申請記憶體大且最小典型值,用這個典型值的大小作為實際要從記憶體堆中割取的記憶體塊大小;為了對每個記憶體塊進行管理,在申請記憶體塊的頭部加入了記憶體塊屬性描述結構體os_mem_blk_node,同時,在記憶體塊的最後加入了記憶體塊溢位標誌,最後將此記憶體塊加入到記憶體使用佇列中;
當應用使用完記憶體後,將使用完成的記憶體塊加入到其對應典型值的空閒佇列中,等待下一次申請時,若相應的典型值佇列中有未被使用的記憶體塊後,先從此典型值佇列中獲取記憶體塊;若典型值佇列中沒有相應的記憶體塊,則去大塊的記憶體堆中割取;
為了對這些記憶體塊節點進行統一管理,設了記憶體塊管理結構體os_mem_heap_man,並由記憶體初始化時進行初始化,在記憶體申請/釋放時進行維護;
(二)資料結構實現
1、每個記憶體塊節點的資料結構
typedef struct os_mem_blk_node
os_mem_blk_node;
2、多個記憶體塊管理結構體(記憶體堆的屬性結構體)
由記憶體申請和釋放函式進行維護,用於記憶體堆中所有記憶體塊的管理;
typedef struct os_mem_heap_man
os_mem_heap_man;
(三)具體函式實現
1、記憶體初始化
osmeminit()函式初始化記憶體堆管理結構體os_mem_heap_man;
2、申請記憶體塊
osmemalloc函式查詢相應的典型值佇列中是否有相應的空閒記憶體塊,若有,返回記憶體塊的首位址,若無,去記憶體堆上割取;
4、釋放記憶體塊
osmemfree函式將使用完的記憶體塊掛接到相應典型值的佇列上;
(四)優缺點
應用程式不在需要人為的去判斷所需要的記憶體大小對應的記憶體塊,記憶體分配時做了相應的典型值匹配。並沒有從根本上解決記憶體碎片的問題。
三、基於夥伴演算法的記憶體管理機制
暫未補充
嵌入式系統 記憶體管理
教材 嵌入式系統及應用,羅蕾 李允 陳麗蓉等,電子工業出版社 嵌入式實時作業系統在記憶體管理方面需要考慮如下因素 快速而確定的記憶體管理 通常的作業系統都至少具有基本的記憶體管理方法 提供記憶體分配與釋放的系統呼叫 不使用虛擬儲存技術 在嵌入式實時作業系統中一般不使用虛擬儲存技術,以避免頁面置換所帶...
嵌入式作業系統概述
實時作業系統 rtos 設計成提供乙個對真實世界的事件的及時響應 timely response 出現在真實世界中的事件可能有乙個時間限制 deadline 在此期限之前,實時 嵌入式系統必須確保在有限時間內對此事件做出相應的響應。根據相應事件的時間限制,嵌入式實時作業系統可以分為兩類 1 硬實時嵌...
嵌入式作業系統簡介
嵌入式作業系統簡介 商用型系統 vxworks 半開源 wince 半開源 免費型 linux ucosii 只適用於控制,不適合遠端,不自帶網路協議棧 linux模仿unix unix是在於1969年在at t的貝爾實驗室開發 備註 丹尼斯.里奇 unix之父 c語言之父 gpl協議 gpl同其它...