最近開發需要使用LwIP協議,搜集到了[瑞典]Adam Dunkels著的書籍,發現有中文翻譯版,分享一波。
LwIP 是 TCP/IP 協議棧的一個實現。它的目的是減少內存使用率和代碼大小,使 LwIP 適用于資源受限系統比如嵌入式系統。為了減少處理和內存需求,LwIP 使用不需要任何數據復制的經過裁剪的 API。
本文描述了 LwIP 的設計與實現。描述了在協議棧實現中以及像內存與緩沖管理這樣的子系統中使用的算法和數據結構。本文還包括 LwIP 的參考手冊以及使用 LwIP 的代碼例子。
圖 2 所示的pbuf 是一個被鏈接的 pbuf例子,在這個 pbuf 鏈中第一個 pbuf是 PBUF RAM 類型,第二個是 PBUF ROM 類型,這意味著它所擁有的數據存儲在 pbuf子系統不能管理的存儲區:
圖 2 一個PBUF RAM類型的 pbuf鏈接了一個數據存儲在外部存儲區的PBUF ROM類型的pbuf
第三種 pbuf類型,PBUF POOL,圖 3 所示,它由分配自固定大小的 pbufs池里的固定大小的 pbufs組成。一個 pbuf鏈可以由 pbufs 的不同類型組成。
這三種類型擁有不同的使用目的。PBUF POOL 主要用于網絡設備驅動層,因為分配一個 pbuf 的操作可以快速完成,所以非常適合用于中斷處理。PBUF ROM 類型的 pbufs 用于應用程序要發送的數據放置在應用程序管理的存儲區的情況。在 pbuf已經移交給 TCP/IP 協議棧后,這些數據是不能被編輯修改的,因此這種 pbuf 類型主要用于數據被放置在 ROM 中的情況(因此名字是 PBUF ROM)。為 PBUF ROM 類型的pbuf 數據預置的包頭存儲在一個 PBUF RAM 類型的 pbuf中,這個 pbuf 被鏈接到這個 PBUF ROM 類型的pbuf 前面,如圖 2 所示。
PBUF RAM類型的pbuf還用于應用程序發送的數據被動態生成的情況。在這種情況下。
pbuf 系統不僅為應用數據分配內存,還要給為這些數據預置的包頭分配內存,見圖 1。pbuf系統不可能預先知道為這些數據預置什么樣的包頭,因而考慮最壞的情況。包頭大小在編譯時是可配置的。其實,收到的 pbufs是 PBUF POOL 類型,發送出的 pbufs是 PBUF ROM 或 PBUF RAM類型。
pbuf 的內部結構參見圖 1 到圖3。pbuf結構包括兩個指針,兩個長度字段,一個標志字段和一個引用計數(reference count)。next 字段是一個指向 pbuf 鏈中下一個 pbuf 的指針。payload 指針指向 pbuf 中數據的開始位置。len 字段包含 pbuf中數據內容的長度。tot_len 字段包含當前 pbuf 的長度與在這個 pbuf 鏈中隨后的所有 pbufs 的 len 字段之和。換句話說,tot_len 字段是 len 字段與 pbuf 鏈中隨后一個 pbuf 的 tot_len 字段的和。flags 字段標識 pbuf的類型,ref字段包含一個引用計數。next 和payload 字段是本地指針,它們占用的字節數與所使用的處理器架構有關。兩個長度字段為 16 位無符號整形,flags 和 ref 字段是 4 位寬。pbuf 結構的實際大小與所使用的處理器架構下的指針大小及最小對齊方式有關。在 32 位指針及 4 字節對齊的架構里,pbuf 的大小為 16 個字節長,在 16 位指針及 1 字節對齊的架構里,pbuf 為9 個字節長。 pbuf 模塊提供了操作 pbufs 的函數。分配一個 pbuf 使用 pbuf_alloc()函數,該函數能夠分配上面描述的三種類型中的任一類型 pbufs。pbuf_ref()函數增加引用計數;厥 pbuf 使用pbuf_free()函數,該函數首先要減少 pbuf 索引計數(reference count)。如果引用計數已經減為 0,這個 pbuf 被回收。pbuf_realloc()函數可以收縮 pbuf 大小,以恰好夠用的內存封裝數據。pbuf_header()函數調整 payload 指針和長度字段以便為 pbuf 中的數據預置包頭。pbuf_chain()與 pbuf_dechain()函數用于鏈接 pbufs。
6.2 內存管理
內存管理模塊支撐的 pbuf 機制很簡單。它負責處理內存連續區域的分配和回收以及收縮已分配內存塊的大小。內存管理模塊使用系統內存的一部分作為自己的專用區域,這確保了網絡系統不會使用系統中所有可用內存,即使網絡系統使用了所有自己的內存,也不會擾亂其它程序的操作。
在內部,內存管理模塊通過在每一個內存分配塊的頂部放置一個比較小的結構體來保存內存分配紀錄。這個結構體擁有三個成員變量,兩個指針一個標志,見圖 4。next 與 prev分別指向內存的下一個和上一個分配塊,used標志標示該內存塊是否已被分配。
完整的pdf格式文檔51黑下載地址(共42頁):
LwIP協議棧的設計與實現_中文譯稿.pdf
(618.87 KB, 下載次數: 80)
2018-12-1 11:14 上傳
點擊文件名下載附件
|