記憶體管理pbuf h標頭檔案原始碼解析 LwIP學習

2021-07-08 11:28:18 字數 2212 閱讀 6955

####一、在定義pbuf之前,首先定義了pbuf的層次和幾種型別。

在定義pbuf之前,首先定義了資料報運送最大值和資料報ip最大值

#define pbuf_transport_hlen 20;	/*定義資料報運送最大值*/

#define pbuf_ip_hlen 20; //定義資料報ip最大值

然後定義了pbuf資料報的幾種層次。

typedef enum pbuf_layer;
然後定義了pbuf的四種型別

typedef enum  pbuf_type;
類別

分配方式

特點使用場合

pbuf_ram

由記憶體堆分配,包括pbuf和資料區

長度不定,分配耗時,用的最多

應用程式和協議棧(協議棧要傳送的資料和應用程式要傳遞的資料一般都採用這個形式)

pbuf_pool

由記憶體池分配,包括pbuf和資料區

長度固定,分配快

中斷服務程式

pbuf_rom

由記憶體池分配,僅包括pbuf

所指資料都位於rom中

應用程式引用記憶體區

pbuf_ref

由記憶體池分配,僅包括pbuf

所指資料位於ram中

應用程式引用記憶體區

1)pbuf_ram記憶體申請(在pbuf.c檔案中):

struct pbuf *p;

p = (struct pbuf*)mem_malloc(lwip_memalign_size(sizeof_struct_pbuf + offset) + lwip_mem_align_size(length));

分配空間:

sizeof_struct_pbuf:pbuf結構頭大小。

offset:資料的包頭(tcp包頭,ip包頭等)。

length:資料儲存空間大小。

2)pbuf_pool記憶體申請:

q = memp_malloc(memp_pbuf_pool);
其中memp_malloc()中引數為memp_t型別。

對於pool型別:memp_pbug_pool屬於pool三大型別中的pbuf_mempool型別。

3)pbuf_rom記憶體申請:

p = memp_alloc(memp_pbuf); /** 在記憶體池中分配乙個相應的pbuf結構頭,而不申請資料區的空間。*/
pbuf_rom指向rom空間內的某段資料

4)pbuf_ref記憶體申請:

p = memp_malloc(memp_pbuf); /** 在記憶體池中分配乙個相應的pbuf結構頭,而不申請資料區的空間 */
pbuf_ref指向ram空間內的某段資料。

每一種pbuf分配記憶體的方式都不一樣,圖1所示

圖1 四種資料報管理結構

只有選擇合適的pbuf型別才能發揮lwip的最大效能,乙個資料報可能是多種pbuf的組合,用鍊錶連線起來,如圖2所示。

圖2 pbuf鍊錶

###二 定義pbuf

struct pbuf ;
###三 定義pbuf的處理函式

pbuf.h中定義,pbuf.c中實現

struct pbuf *pbuf_alloc( );

void pbuf_realloc( );

u8_t pbuf_header( );

void pbuf_ref( );

void pbuf_ref_chain( );

u8_t pbuf_free( );

u8_t pbuf_clen( );

void pbuf_cat( );

void pbuf_chain( );

struct pbuf *pbuf_dechain( );

err_t pbuf_copy( );

u16_t pbuf_copy_partial( );

PHP原始碼分析(記憶體管理)

void ptr emalloc size efree ptr 釋放記憶體的時候只傳入ptr,並沒有傳入釋放記憶體大小 當我們申請乙個size大小的記憶體的時候,我們多申請一些存起來,下次使用者申請的時候,直接給出相應大小的記憶體即可,這樣減少了使用者態和核心態的切換,提高效率,記憶體 的時候需要知...

Redis原始碼分析 記憶體管理

原始碼版本 redis 2.4.4 redis記憶體相關函式都放在zmalloc.h zmalloc.c中 redis中可以使用tcmalloc jemalloc makefile ifeq use tcmalloc yes alloc dep alloc link ltcmalloc alloc ...

FreeRTOS記憶體管理原始碼分析

記憶體管理一直都是重中之重的知識。記憶體管理在freertos系統中是可裁剪可配置的。freertos提供了5種記憶體管理方案。暫時可能分析不完5種方案,今天能寫多少先寫多少,後續有時間了再一點一點的寫吧。5中方案對比如下 方案1 記憶體一旦分配出去就無法 了。記憶體釋放函式是乙個空函式,什麼都沒做...