91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SylixOS中netdev_pbuf_alloc函數分析

發布時間:2020-08-04 01:45:24 來源:網絡 閱讀:797 作者:諸葛一帆丶 欄目:編程語言

1.netdev_pbuf_alloc函數簡介

netdev_pbuf_alloc是網卡驅動中的內存申請函數,申請一塊緩沖區用于存放網絡報文數據。

2.pbuf結構分析

netdev_pbuf_alloc函數以pbuf結構申請內存空間,如程序清單 2.1所示。

程序清單 2.1  pbuf結構

struct pbuf {
    struct pbuf      *next;                                                                  
    void             *payload;
    u16_t            tot_len;
    u16_t            len;
    u8_t             type;
    u8_t             flags;
    u16_t            ref;
};

3.pbuf_alloc函數封裝

netdev_pbuf_alloc函數是pbuf_alloc函數的函數封裝,對外提供的函數接口只帶有一個參數用于指定申請的緩沖區大小。而pbuf_alloc函數有三個參數,分別是申請的pbuf數據緩沖區是否帶有偏移,數據緩沖區大小及緩沖區類型。在netdev_pbuf_alloc函數中,申請的pbuf結構緩沖區數據偏移固定為0,緩沖區類型為PBUF_POOL。netdev_pbuf_alloc函數傳入的第二個參數緩沖區大小在調用pbuf_alloc函數申請pbuf結構時會被增加一個reserve長度,用于協議棧中的部分特殊操作。

3.1 pbuf_alloc函數第一個參數分析

在網絡中通信的數據報文,除了真正的數據段外,還包括了TCP/IP各層協議的報文頭。如用戶有特殊需求,要在應用層構建報文并直接通過網卡驅動發送,則需要申請pbuf結構的數據緩沖區帶有各層偏移,如程序清單 3.1所示。

程序清單 3.1  pbuf_alloc第一個參數分析

typedef enum {
  PBUF_TRANSPORT,                                        /*  傳輸層報文頭偏移          */
  PBUF_IP,                                               /*  IP層報文頭偏移           */
  PBUF_LINK,                                             /*  鏈路層報文頭偏移         */
  PBUF_RAW_TX,                                           /*  封裝鏈路層偏移           */
  PBUF_RAW                                               /*  無偏移                 */
} pbuf_layer;

3.2 pbuf_alloc函數第三個參數分析

申請pbuf結構需要指定pbuf類型,原因是不同類型的pbuf申請內存的方式不同,如程序清單 3.2所示。

程序清單 3.2  pbuf_alloc第三個參數分析

typedef enum {
  PBUF_RAM,                                                 /*  內存堆分配             */
  PBUF_ROM,                                                 /*  指向ROM空間內數據      */
  PBUF_REF,                                                 /*  指向RAM空間內數據      */
  PBUF_POOL                                                 /*  內存池分配             */
} pbuf_type;

PBUF_RAM類型的pbuf主要通過內存堆分配得到,協議棧劃分了一塊空間用于申請PBUF_RAM類型的pbuf,劃分的空間大小通過“libsylixos/SylixOS/config/net/net_perf_cfg.h”中的“LW_CFG_LWIP_MEM_SIZE”宏配置。

PBUF_REF和PBUF_ROM類型的pbuf基本相同,前者指向ROM空間內的某段數據,而后者指向RAM空間內的某段數據。PBUF_REF和PBUF_ROM類型的pbuf通過“libsylixos/SylixOS/config/net/net_perf_cfg.h”中的“LW_CFG_LWIP_NUM_PBUFS”宏配置在內存池中預分配pbuf的最大數量。

PBUF_POOL類型的pbuf通過內存池分配,這種類型的pbuf可以在極短時間內得到分配,在網卡驅動接收數據時,一般采用這種方式。協議棧會在內存池中預先分配適當數量和大小的內存空間,通過“libsylixos/SylixOS/config/net/net_perf_cfg.h”中的“LW_CFG_LWIP_POOL_SIZE和LW_CFG_LWIP_NUM_POOLS”宏配置。

3.3 PBUF_POOL類型pbuf申請流程

netdev_pbuf_alloc函數申請PBUF_POOL類型pbuf,若申請的緩沖區大于PBUF_POOL池中單個pbuf緩沖區長度,系統會分配多個固定大小的PBUF_POOL類型pbuf,并把這些pbuf鏈成一個鏈表,以滿足用戶的分配空間請求,如圖 3.1所示。

SylixOS中netdev_pbuf_alloc函數分析

3.1  PBUF_POOL類型pbuf申請流程

4.實際應用

網卡驅動收到數據后,會調用netdev_pbuf_alloc函數申請pbuf結構,并將數據拷貝至pbuf。當有大量數據被網卡驅動接收時,可能會造成申請pbuf結構失敗,原因是系統預分配的內存池中的pbuf結構已經全部被申請,還未被釋放。可以嘗試通過“libsylixos/SylixOS/config/net/net_perf_cfg.h”中的“LW_CFG_LWIP_POOL_SIZE和LW_CFG_LWIP_NUM_POOLS”宏配置增大pbuf緩沖區大小和數量解決pbuf結構申請失敗問題。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

横峰县| 克什克腾旗| 云南省| 夹江县| 苗栗市| 凤台县| 锡林郭勒盟| 嵊州市| 黄龙县| 石城县| 临泉县| 安国市| 五家渠市| 谷城县| 长泰县| 宁晋县| 华宁县| 伊宁县| 昌乐县| 大埔区| 霍山县| 饶河县| 驻马店市| 阿瓦提县| 淮北市| 江西省| 海南省| 岑巩县| 剑河县| 新兴县| 百色市| 玉山县| 顺义区| 江孜县| 嵊泗县| 双城市| 兴海县| 保靖县| 平舆县| 成安县| 偃师市|