uip協議棧分析(2)

2021-08-21 21:23:53 字數 2459 閱讀 7264

uip的記憶體管理方法:

記憶體管理的實現在memb.c/memb.h裡。

這兩個檔案負責uip的記憶體塊的管理,記憶體塊是由memb()巨集宣告。記憶體從宣告的記憶體塊裡用memb_alloc()分配,用memb_free()釋放。因為命名空間的衝突,每個c模組只能有乙個memb()巨集宣告。

先看memb.h檔案:

#define memb_concat2(s1, s2) s1##s2

#define memb_concat(s1, s2)memb_concat2(s1, s2)

這兩個巨集很容易看出來是連線兩個字串的。

#define memb(name, structure, num)/

static char memb_concat(name,_memb_count)[num]; /

static structure memb_concat(name,_memb_mem)[num]; /

static struct memb_blocks name =

這個巨集用來宣告乙個陣列,這個陣列是由多個特定大小的記憶體塊組成。第乙個引數用來作為記憶體塊的名字標示,第二個引數是記憶體塊中的子塊的資料結構,第三個引數是記憶體塊中子塊的數目。

static char memb_concat(name,_memb_count)[num];這句明顯可以看出來是宣告乙個陣列,表示子塊的引用計數,展開後就是static char name_memb_count[num]。

static structure memb_concat(name,_memb_mem)[num];這句就是靜態陣列用來分配實際記憶體的,展開後就是static structure name_memb_mem[num]。包含num個子塊的記憶體,記憶體的資料型別是structure。

static struct memb_blocks name =

這句宣告乙個指定名字的記憶體塊,並為記憶體塊結構體賦值,記憶體塊結構體memb_blocks:

struct memb_blocks {

unsigned short size;  //子塊的大小

unsigned short num;  //子塊的數目

char *count;  //每個子塊引用計數,表示正在使用還是未被使用

void *mem;  //記憶體塊首位址

再看memb.c:

void  memb_init(struct memb_blocks *m)

memset(m->count, 0, m->num);

memset(m->mem, 0, m->size * m->num);

這個函式把前面用memb巨集宣告的記憶體塊初始化,即把memb_blocks結構體裡的count和mem項清零。引數m就是用memb宣告的name。

void *  memb_alloc(struct memb_blocks *m)

int i;

for(i = 0; i < m->num; ++i) {

if(m->count[i] == 0) {

/* 如果子塊未被使用, 增加應用計數表示現在被使用,並且返回指向這個記憶體塊的指標*/

++(m->count[i]);

return (void *)((char *)m->mem + (i * m->size));

/* 未發現空閒塊, 返回null表示分配記憶體失敗*/

return null;

char memb_free(struct memb_blocks *m, void *ptr)

int i;

char *ptr2;

/* 遍歷記憶體塊列表試圖找到ptr指標指向的記憶體子塊*/

ptr2 = (char *)m->mem;

for(i = 0; i < m->num; ++i) {

if(ptr2 == (char *)ptr) {

/* 找到ptr指向的記憶體子塊,減少引用計數並返回新的計數值 */

if(m->count[i] > 0) {

/*確保沒有減少未使用的記憶體子塊引用計數 */

--(m->count[i]);

return m->count[i];

ptr2 += m->size;

return -1;

struct telnetd_line {

char line[telnetd_conf_linelen];

memb(linemem, struct telnetd_line, telnetd_conf_numlines);

memb_init(&linemem);   memb_alloc(&linemem);    memb_free(&linemem, line);

使用起來非常方便容易,缺點是只能分配固定大小的子塊。但至少不會產生記憶體碎片了,而且由於是靜態宣告的,會自動進行對齊。

uip協議棧分析(2)

uip的記憶體管理方法 記憶體管理的實現在memb.c memb.h裡。這兩個檔案負責uip的記憶體塊的管理,記憶體塊是由memb 巨集宣告。記憶體從宣告的記憶體塊裡用memb alloc 分配,用memb free 釋放。因為命名空間的衝突,每個c模組只能有乙個memb 巨集宣告。先看memb.h...

uIP協議棧分析

uip特性 由於uip協議棧專門為嵌進式系統而設計,因此還具有如下優越功能 1 非常少,其協議棧 不到6k,很方便閱讀和移植。2 占用的記憶體數非常少,ram占用僅幾百位元組。3 其硬體處理層 協議棧層和應用層共用乙個全域性快取區,不存在資料的拷貝,且傳送和接收都是依靠這個快取區,極大的節省空間和時...

uip協議棧分析(1)

uip的原始碼目錄結構 研究unix下的 可以知道uip是如何使用的,關鍵是理解uip協議棧的主控制迴圈。int main void int i uip ipaddr t ipaddr struct timer periodic timer,arp timer 設定tcp超時處理時間和arp老化時間...