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 ;
再看memb.c
:voidmemb_init(struct memb_blocks *m)
這個函式把前面用
memb
巨集宣告的記憶體塊初始化,即把
memb_blocks
結構體裡的
count
和mem
項清零。引數
m就是用
memb
宣告的name
。void *memb_alloc(struct memb_blocks *m)
}/*
未發現空閒塊
, 返回
null
表示分配記憶體失敗*/
return null;
}char memb_free(struct memb_blocks *m, void *ptr)
return m->count[i];
}ptr2 += m->size;
}return -1;
}目錄下的
telnetd.c
正好用到了
memb.c
裡的函式:
struct telnetd_line ;
memb(linemem, struct telnetd_line, telnetd_conf_numlines);
memb_init(&linemem);memb_alloc(&linemem);memb_free(&linemem, line);
使用起來非常方便容易,缺點是只能分配固定大小的子塊。但至少不會產生記憶體碎片了,而且由於是靜態宣告的,會自動進行對齊。
uIP協議棧學習(一)
uip 源 可以從 uip的原始碼目錄結構 目錄是一些應用層的協議和例項,doc目錄是文件,lib目錄下有記憶體塊管理函式,uip下 uip協議棧的源 unix 下是unix 環境裡的 uip應用例子。研究unix 下的 可以知道 uip是如何使用的,關鍵是理解 uip協議棧的主控制迴圈。int m...
uIP協議棧分析
uip特性 由於uip協議棧專門為嵌進式系統而設計,因此還具有如下優越功能 1 非常少,其協議棧 不到6k,很方便閱讀和移植。2 占用的記憶體數非常少,ram占用僅幾百位元組。3 其硬體處理層 協議棧層和應用層共用乙個全域性快取區,不存在資料的拷貝,且傳送和接收都是依靠這個快取區,極大的節省空間和時...
uip協議棧分析(2)
uip的記憶體管理方法 記憶體管理的實現在memb.c memb.h裡。這兩個檔案負責uip的記憶體塊的管理,記憶體塊是由memb 巨集宣告。記憶體從宣告的記憶體塊裡用memb alloc 分配,用memb free 釋放。因為命名空間的衝突,每個c模組只能有乙個memb 巨集宣告。先看memb.h...