liteos的記憶體支援靜態分配、動態分配兩種,亦即box和dlink演算法,類似位元組塊和位元組池的差異,靜態分配方式中儲存空間大小一致,而動態分配可以使用變化大小的儲存空間。
一、box分配方式
box演算法中記憶體塊的大小是由初始化的時刻固定的。提供magic賦值方式用於記憶體檢查,即在每塊申請空間前乙個word用於填寫固定值的方式檢查記憶體破壞情況。
1、使用結構體
los_membox_info只是在連續儲存空間開始作為頭資訊
typedef struct
{ uint32 uwblksize; /**2、初始化
一塊連續儲存空間,經過box演算法初始化函式初始化後,結構形式如下:
hedaer即為los_membox_info的資訊,包含塊大小、個數及可使用記憶體塊鍊錶的頭結點。block1-n的大小相同,均為los_membox_info中uwblksize大小。在初始化時,沒個儲存空間塊的頭位址作為結點鍊錶位址,即作為tagmembox_node指標使用,來維護鍊錶。
3、申請
使用malloc申請時,從空閒記憶體塊鍊錶中得到乙個block,並返回相應位址,同時刪除相應鍊錶節點。如下連續申請兩個記憶體塊的情況:
注意malloc返回的位址1和2並不完全等同於block1、2的起始位址,取決於是否在block塊開始部分占用儲存空間用於記憶體檢查。
4、釋放
釋放時,將相應釋放的記憶體塊加入空閒鍊錶。
二、dlink分配方式
dlink分配演算法中,使用者可以根據需求申請可變大小的儲存空間,相對於box方式,更靈活,但維護也相對複雜些。沒有完全研究所有**,說說自己的理解。
1、使用結構體
文件提供的結構圖,實現包含三個部分,第一部分是整體的memory的位址及大小;第二部是乙個鍊錶的表頭陣列,對應著空閒的不同大小的儲存空間煉表表頭;第三部分是可以申請的儲存空間及其頭資訊。
使用的結構體大致包括
typedef struct
{ void *ppooladdr; /**2、初始化
理解上dlnk模式下,初始化只生成一整塊可用的memory。
3、申請
申請memory時,需要找到合適大小的儲存空間進行分配,而大的位址空間可以拆分成不同的位址空間。在dlnk煉表頭節點只表示一定範圍儲存空間大小,所以在每個node中還需記錄具體準確的儲存大小。
例如,順序申請a、b、c空間,理解上使用者可用大小為a總大小減去node header即los_mem_dyn_node的大小:
4、釋放
釋放時需要將可用空間放入相應空閒列表,可以將連續小的儲存片合併成更大的可用空間。在目前的結構上,當前空間的前乙個分配空間位址可以通過los_mem_dyn_node中的pstprenode得到,而後乙個位址通過uwsizeandflag含有的size大小,與node的起始位址運算可得。
如釋放b再釋放a的過程:
los_multiple_dlnk_head的作用,主要是對不同大小範圍的分片memory通過鍊錶級聯起來,
如a、b、c、d一樣大小
LiteOS 記憶體管理
參考 野火 物聯網作業系統 liteos 開發實戰指南 huawei liteos 中文網 8.1.1 概念 不採用c標準庫中的記憶體管理函式malloc 和free 原因 8.1.2 特點 動態記憶體 在動態記憶體池中分配使用者指定大小的記憶體塊 liteos給提供了多種記憶體動態匹配演算法預設使...
記憶體管理之記憶體定址
記憶體定址 三種記憶體位址 邏輯位址 logical address 包含機器語言指令中用來指定乙個運算元或一條指令的位址 線性位址 linear address 線性位址也稱為虛擬位址 virtual address 實體地址 physical address 用於記憶體晶元級記憶體單元定址,他們...
c 之記憶體管理
c 使用3 種不同解決方案儲存資料,區別是資料保留在記憶體中的時間 兩種儲存持續性為自動 自動變數和暫存器變數 register 沒有記憶體位址 堆疊 在函式外定義的變數和使用關鍵字static定義的變數的儲存持續性都為靜態.分為 3 外部鏈結性,內部鏈結性和無鏈結性 所有靜態變數都有下面的兩個初始...