LwIP協議棧學習之動態記憶體管理

2021-10-08 15:38:28 字數 1891 閱讀 9759

lwip 的動態記憶體管理機制可以有三種:

動態記憶體堆分配策略可以有兩種實現方式:

通過開闢乙個記憶體堆,然後通過模擬 c 執行時庫的記憶體分配策略來實現。

通過動態記憶體池的方式來實現,也即動態記憶體堆分配函式通過簡單呼叫動態記憶體池(pool)分配函式來完成其功能,此時,需要在標頭檔案lwippools.h 中定義巨集

mem_use_pools 和 mem_use_custom_pools 為 1,同時還要開闢一些額外的緩衝池

區,如下:

lwip_malloc_mempool_start

lwip_malloc_mempool(20

,256

)lwip_malloc_mempool(10

,512

)lwip_malloc_mempool(5

,1512

)lwip_malloc_mempool_end

上述**表示為動態記憶體堆相關功能函式分配 20 個 256 位元組長度的記憶體塊, 10 個 512 位元組的記憶體塊, 5 個 1512 位元組的記憶體塊。

記憶體池管理會根據以上的巨集自動在記憶體中靜態定義乙個大片記憶體用於記憶體池。在記憶體分配申請的時候,自動根據所請求的大小,選擇最合適他長度的池去申請。如 果 啟 用 巨集

mem_use_pools_try_bigger_pool,那麼,如果上述的最適合長度的池中沒有空間

可以用了,分配器將從更大長度的池中去申請。

模擬c執行時庫的分配策略實現

動態記憶體堆分配策略原理就是在乙個事先定義好大小的記憶體塊中進行管理,其記憶體分配的策略是採用最快合適(first fit)方式,只要找到乙個比所請求的記憶體大的空閒塊,就從中切割出合適的塊,並把剩餘的部分返回到動態記憶體堆中。

lwip中實現的函式解析

mem_init( ) 記憶體堆的初始化函式,主要是告知記憶體堆的起止位址,以及初始化空閒列表,由 lwip 初始化時自己呼叫,該介面為內部私有介面,不對使用者層開放。

mem_malloc( ) 申請分配記憶體。將總共需要的位元組數作為引數傳遞給該函式,返回值是指向最新分配的記憶體的指標。分配的空間大小會受到記憶體對齊的影響,可能會比申請的略大。

mem_calloc( ) 是對 mem_malloc( )函式的簡單包裝,他有兩個引數,分別為元素的數目和每個元素的大小,這兩個引數的乘積就是要分配的記憶體空間的大小。

動態記憶體池(pool)分配策略的實現

lwip中的實現

static u8_t memp_memory [ mem_alignment -

1#define lwip_mempool(name,num,size,desc) + ( (num) * (memp_size + memp_align_size(size) ) )

#include

"lwip/memp_std.h"

];

上面的**定義了緩衝池所使用的記憶體緩衝區。標頭檔案memp_std.h可以被簡化為諸多條lwip_mempool(name,num,size,desc)。又由於用了 define 關鍵字將 lwip_mempool(name,num,size,desc)定義為+((num) * (memp_size + memp_align_size(size))),所以, memp_std.h 被編譯後就為一條一條的+(), +(), +(), +() ….所以最終的陣列memp_memory等價定義為:

static u8_t memp_memory [ mem_alignment – 1

+()+() ….

];

至於mem_alignment-1是由於考慮了編譯器的字對齊問題。

基於上面的陣列建立方法,lwip還建立了一些與緩衝池管理的全域性變數:

實現函式

老衲五木:tcp/ip協議棧lwip的設計與實現

lwip協議棧學習 udp

書籍 嵌入式網路那些事 lwip協議 udp協議的優點 1 基於ip協議,無連線的使用者資料報協議,適用於傳送大批量資料,2 實時性比較高,適用於嵌入式網路 udp sendto通過呼叫函式udp sendto if完成報文的組裝和傳送,在呼叫udp sendto if之前,與ip層進行互動操作,機...

LWIP協議棧學習 一 ARP協議

arp所實現的功能就是通過ip位址獲取到mac位址,並且將ip和mac對映到一起,儲存到arp表中.dest mac src mac frame type hardware type protocol type hardware addr len protocol addr len opsend m...

c 之動態記憶體

了解動態記憶體在 c 中是如何工作的是成為一名合格的 c 程式設計師必不可少的。c 程式中的記憶體分為兩個部分 很多時候,您無法提前預知需要多少記憶體來儲存某個定義變數中的特定資訊,所需記憶體的大小需要在執行時才能確定。在 c 中,您可以使用特殊的運算子為給定型別的變數在執行時分配堆內的記憶體,這會...